树的基本操练:
1.求叶子结点的数目
代码:
//定义全局变量
int sum;
void CountLeafNum(BiTNode*T)
{
if( T != NULL)
{
if(T->child == NULL && T->child == NULL)
{
sum++;
}
if(T->lchild)//左子树
{
coutLeaf(T->lchild);
}
if(T->rchild)//右子树
{
coutLeaf(T->rchild);
}
}
}
int main()
{
sum = 0;
coutLeaf(&t1);
printf("sum:%d \n",sum);
}
但这个代码中定义一个全局变量sum,就会引来资源临界问题。优化代码如下:
递归:
void CountLeafNum1(BiTNode*T,int *sum)
{
if( T != NULL)
{
if(T->child == NULL && T->child == NULL)
{
(*sum)++;
}
if(T->lchild)//左子树
{
coutLeafNum1(T->lchild,sum);
}
if(T->rchild)//右子树
{
coutLeafNum1(T->rchild,sum);
}
}
}
int main()
{
int mysum = 0;
coutLeafNum1(&t1,&sum);
printf("sum:%d \n",sum);
}
2.copy二叉树
BiTNode * CopyTree(BiTNode * T)
{
BiTNode * newNode = NULL;
//定义一个左孩子
BiTNode * newLp = NULL;
//定义一个右孩子
BiTNode * newRp = NULL;
if(T == NULL)
{
return NULL;
}
//copy左子树
if(T->lchild != NULL)
{
newLp = CopyTree(T->lchild);
}
else
{
newLp = NULL;
}
//拷贝右子树
if(T->child != NULL)
{
newRp = CopyTree(T->rchild);
}
else
{
newRp = NULL;
}
//malloc根节点
newNode =(BiTNode* )malloc(sizeof(BiTNode));
if(newNode == NULL)
{
return NULL;
}
newNode->lchild = newLp;
newNode->rchild = newRp;
newNode->data = T->data;
return NULL;
}
int main()
{
BiTNode t1,t2,t3,t4,t5;
memset(&t1,0,sizeof(BiTNode));
memset(&t2,0,sizeof(BiTNode));
memset(&t3,0,sizeof(BiTNode));
memset(&t4,0,sizeof(BiTNode));
memset(&t5,0,sizeof(BiTNode));
t1.data = 1;
t2.data = 2;
t3.data = 3;
t4.data = 4;
t5.data = 5;
//建立关系
t1.lchild = &t2;
t1.rchild = &t3;
t2.lchild = &t4;
t3.lchild = &t5;
//树的遍历
printf("%d\n",Depth(&t1));
[
BiTNode *root = CoptTree(&t1);//生成一颗新树
printf("Copy inorder\n");
inOrder(root);
printf("hello....\n");
]
printf("older inorder\n");
inOrder(&t1);
printf("hello....\n");
return;
}
3.求树的深度
void inOrder(BiTNode *root)
{
if(root == NULL)
{
return;
}
inOrder(root->lchild);
inOrder(root->rchild);
}
int Depth(BiTNode *T)
{
int deptleft = 0;//左子树的高度
int deptright = 0;//右子树的高度
int deptval = 0;
if(T == NULL)
{
deptval = 0;
return deptval;
}
deptleft = Depth(t->lchild);//求左子树高度
deptleft = Depth(t->rchild);//求右子树高度
//谁大加1(根节点高度)
deptval = 1+(deptleft > deptright ? deptleft:deptright);
return deptval;
}
int main()
{
BiTNode t1,t2,t3,t4,t5;
memset(&t1,0,sizeof(BiTNode));
memset(&t2,0,sizeof(BiTNode));
memset(&t3,0,sizeof(BiTNode));
memset(&t4,0,sizeof(BiTNode));
memset(&t5,0,sizeof(BiTNode));
t1.data = 1;
t2.data = 2;
t3.data = 3;
t4.data = 4;
t5.data = 5;
//建立关系
t1.lchild = &t2;
t1.rchild = &t3;
t2.lchild = &t4;
t3.lchild = &t5;
//树的遍历
printf("%d\n",Depth(&t1));
printf("inorder\n");
inOrder(&t1);
printf("hello...\n");
return;
}