二叉树
来源:互联网 发布:中银淘宝信用卡额度 编辑:程序博客网 时间:2024/06/08 09:51
#include<stdio.h>
#include <string.h>
#include <malloc.h>
#define MAX_NUM 100
int g_buffer[MAX_NUM];
int g_bufferNum = 0;
typedef struct tnode{
int d;
struct tnode *pleft;
struct tnode *pright;
}TNODE;
typedef struct Stack{
TNODE data[30];
int top;
}STACK;
TNODE *g_ptree = NULL;
STACK g_stack;
void initNode(TNODE *pNode,int d){
if(NULL != pNode){
pNode->d = d;
pNode->pleft = NULL;
pNode->pright = NULL;
}
return;
}
/*添加节点*/
TNODE *addTree(TNODE *ptree,int d){
TNODE *pNewNode = NULL;
if(ptree==NULL){
pNewNode = (TNODE *)malloc(sizeof(TNODE));
if(pNewNode){
initNode(pNewNode,d);
ptree = pNewNode;
printf("new a new node %d\n",pNewNode->d);
}
}
else{
if(ptree->d==d){
}
else if(ptree->d>d){
ptree->pleft = addTree(ptree->pleft,d);
}
else{
ptree->pright = addTree(ptree->pright,d);
}
}
return ptree;
}
/*成功返回0,不成功返回-1*/
TNODE * getSuccessNode(TNODE *pNode){
TNODE *SuccessP = pNode;
TNODE *Success = pNode;
TNODE *Cur = pNode->pright;
while(Cur){
SuccessP = Success;
Success = Cur;
Cur = Cur->pleft;
}
if(Success != pNode->pright){
SuccessP->pleft = Success->pright;
Success->pright = pNode->pright;
}
return Success;
}
/*删除节点*/
int removeTreeNode(TNODE **pptree,int d){
TNODE *pParent = NULL;
TNODE *pCur = *pptree,*psuccessNode = NULL;
bool isFind = false;
bool isLeftChild = false;
if(!pptree){
return -1;
}
while(pCur->d != d){
pParent = pCur;
if(pCur->d >d){
isLeftChild = true;
pCur = pCur->pleft;
}
else{
isLeftChild = false;
pCur = pCur->pright;
}
if(!pCur){
return -1;
}
}
/*已经找到了*/
if(!pCur->pleft && !pCur->pright){
/*(1)节点没有子节点*/
if(pCur == *pptree){
*pptree = NULL;
}
else{
if(isLeftChild){
pParent->pleft = NULL;
}
else{
pParent->pright = NULL;
}
}
}
else if(!pCur->pright){
/*(2.1)只有左节点*/
if(pCur == *pptree){
*pptree = pCur->pleft;
}
else{
if(isLeftChild){
pParent->pleft = pCur->pleft;
}
else{
pParent->pright = pCur->pleft;
}
}
}
else if(!pCur->pleft){
/*(2.1)只有右节点节点*/
if(pCur == *pptree){
*pptree = pCur->pright;
}
if(isLeftChild){
pParent->pleft = pCur->pright;
}
else{
pParent->pright = pCur->pright;
}
}
else{
psuccessNode = getSuccessNode(pCur);
if(pCur == *pptree){
*pptree = psuccessNode;
}
if(isLeftChild){
pParent->pleft = psuccessNode;
}
else{
pParent->pright = psuccessNode;
}
psuccessNode->pleft = pCur->pleft;
}
printf("remove %d \n",pCur->d);
free(pCur);
return 0;
}
void printNode(TNODE *ptree){
printf("ptree = ");
if(ptree){
printf("%d\n",ptree->d);
if(ptree->pleft){
printNode(ptree->pleft);
}
if (ptree->pright){
printNode(ptree->pright);
}
}
return;
}
int findMin(TNODE *ptree){
if(!ptree){
return -1;
}
if(ptree->pleft){
return findMin(ptree->pleft);
}
else{
return ptree->d;
}
}
int findMax(TNODE *ptree){
if(!ptree){
return -1;
}
if(ptree->pright){
return findMax(ptree->pright);
}
else{
return ptree->d;
}
}
void initStack(){
g_stack.top = 0;
}
/*非递归实现二叉树的前序遍历,要求时间复杂度和空间复杂度都是O(n)*/
void pre(TNODE *pNode){
}
main(){
int i = 5;
addTree(g_ptree,6);
addTree(g_ptree,4);
addTree(g_ptree,3);
addTree(g_ptree,5);
addTree(g_ptree,7);
addTree(g_ptree,8);
printNode(g_ptree);
//printf("findMin %d\n",findMin(g_ptree));
//printf("findMax %d\n",findMax(g_ptree));
//removeTreeNode(&g_ptree,0);
//printNode(g_ptree);
}
- 二叉树、二叉堆
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- Linux的inode的理解
- APP金准位,将推广进行到底
- 如何在Android Market中SEO你的APP应用
- 拨打电话简单Demo
- SQL 2008 服务启动失败的原因和解决方法汇总。
- 二叉树
- About Concurrent Modification Exception
- 1075 求年月日
- div+css布局(一)
- 让你低调的app脱颖而出
- 坑爹的冒泡排序,写傻逼了!
- Linux下LED驱动测试(应用程序)源码
- Fedora硬盘安装Fedora17图文教程
- PHP采集 抓取