二叉树的基本操作

  • 格式:doc
  • 大小:42.00 KB
  • 文档页数:6

二叉树的基本操作

1、定义二叉树

typedef struct ChainTree

{

DATA data;

struct ChainTree *left;

struct ChainTree *right;

}ChainBinTree;

2、初始化二叉树的根节点

ChainBinTree *InitRoot()

{

ChainBinTree *node;

if(node=(ChainBinTree *)malloc(sizeof(ChainBinTree))) //分配内存

{

printf("\n输入根结点数据:");

scanf("%s",&node->data);

node->left=NULL;

node->right=NULL;

return BinTreeInit(node);

}

return NULL;

3、为二叉树添加数据(n只能取1或2)

int BinTreeAddNode(ChainBinTree *bt,ChainBinTree *node,int n)

//bt为父结点,node为子结点,n=1表示添加左子树,n=2表示添加右子树

{

if(bt==NULL)

{

printf("父结点不存在,请先设置父结点!\n");

return 0;

}

switch(n)

{

case 1:

if(bt->left)

{

printf("左子树结点不为空!\n");

return 0;

}else

bt->left=node;

break;

case 2:

if( bt->right)

{

printf("右子树结点不为空!\n");

return 0;

}else

bt->right=node;

break;

default:

printf("参数错误!\n");

return 0;

}

return 1;

}

4、返回左子结点

ChainBinTree *BinTreeLeft(ChainBinTree *bt)

{

if(bt)

return bt->left;

else

return NULL;

}

5、返回右节点

ChainBinTree *BinTreeRight(ChainBinTree *bt)

{

if(bt)

return bt->right;

else

return NULL;

}

6、检查二叉树是否为空

int BinTreeIsEmpty(ChainBinTree *bt)

{

if(bt)

return 0;

else

return 1;

}

7、求二叉树的深度(递归)

int BinTreeDepth(ChainBinTree *bt)

{

int dep1,dep2;

if(bt==NULL)

return 0;

else

{

dep1 = BinTreeDepth(bt->left);

dep2 = BinTreeDepth(bt->right);

if(dep1>dep2)

return dep1 + 1;

else

return dep2 + 1;

}

}

8、查找数据为data的节点

ChainBinTree *BinTreeFind(ChainBinTree *bt,DATA data) //在二叉树中查找值为data的结点

{

ChainBinTree *p;

if(bt==NULL)

return NULL;

else

{

if(bt->data==data)

return bt;

else{

if(p=BinTreeFind(bt->left,data))

return p;

else if(p=BinTreeFind(bt->right, data))

return p;

else

return NULL;

}

}

}

9、清空二叉树

void BinTreeClear(ChainBinTree *bt)

{

if(bt)

{

BinTreeClear(bt->left);

BinTreeClear(bt->right);

free(bt);

bt=NULL;

}

return;

}

10、先序遍历

void BinTree_DLR(ChainBinTree *bt,void (*oper)(ChainBinTree *p))

{

if(bt)

{

oper(bt);

BinTree_DLR(bt->left,oper);

BinTree_DLR(bt->right,oper);

}

return;

}

11、中序遍历

void BinTree_LDR(ChainBinTree *bt,void(*oper)(ChainBinTree *p))

{

if(bt)

{

BinTree_LDR(bt->left,oper);

oper(bt);

BinTree_LDR(bt->right,oper);

}

return;

}

12、后序遍历

void BinTree_LRD(ChainBinTree *bt,void (*oper)(ChainBinTree *p))

{

if(bt)

{

BinTree_LRD(bt->left,oper);

BinTree_LRD(bt->right,oper);

oper(bt);

}

return;

}

13、层次遍历

void BinTree_Level(ChainBinTree *bt,void (*oper)(ChainBinTree *p))

{

ChainBinTree *p;

ChainBinTree *q[QUEUE_MAXSIZE]; //定义一个顺序栈

int head=0,tail=0;//队首、队尾序号

if(bt)//若队首指针不为空

{

tail=(tail+1)%QUEUE_MAXSIZE;//计算循环队列队尾序号

q[tail] = bt;//将二叉树根指针进队

}

while(head!=tail) //队列不为空,进行循环

{

head=(head+1)%QUEUE_MAXSIZE; //计算循环队列的队首序号

p=q[head]; //获取队首元素

oper(p);//处理队首元素

if(p->left!=NULL) //若结点存在左子树,则左子树指针进队

{

tail=(tail+1)%QUEUE_MAXSIZE;//计算循环队列的队尾序号

q[tail]=p->left;//将左子树指针进队

}

if(p->right!=NULL)//若结点存在右孩子,则右孩子结点指针进队

{

tail=(tail+1)%QUEUE_MAXSIZE;//计算循环队列的队尾序号

q[tail]=p->right;//将右子树指针进队

}

}

return;

}

14、建立二叉树

void CreateBiTree(BiTree *T)

{ /* 算法6.4:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),*/

/* 构造二叉链表表示的二叉树T。变量Nil表示空(子)树。有改动 */

TElemType ch;

scanf(form,&ch);

if(ch==Nil) /* 空 */

*T=NULL;

else

{

*T=(BiTree)malloc(sizeof(BiTNode)); /* 生成根结点 */

if(!*T)

exit(OVERFLOW);

(*T)->data=ch;

CreateBiTree(&(*T)->lchild); /* 构造左子树 */

CreateBiTree(&(*T)->rchild); /* 构造右子树 */

}