#if 0
//树的应用
//1、求树的叶子节点: 度为0的节点
//先判断根节点是否是叶子节点,然后计算左子树的叶子节点个数
//在计算 右子树节点个数
void coutLeaf(BiNode *T, int *sum)
{
if (T != NULL){
//相当于先序遍历这棵树,计算叶子节点
if (T->lchild == NULL && T->rchild == NULL){
(*sum)++;
}
if (T->lchild){
coutLeaf(T->lchild, sum);
}
if (T->rchild){
coutLeaf(T->rchild, sum);
}
}
}
void coutLeaf02(BiNode *T, int *sum)
{
if (T != NULL){
if (T->lchild){
coutLeaf(T->lchild, sum);
}
//相当于中序遍历这棵树,计算叶子节点
if (T->lchild == NULL && T->rchild == NULL){
(*sum)++;
}
if (T->rchild){
coutLeaf(T->rchild, sum);
}
}
}
void coutLeaf03(BiNode *T, int *sum)
{
if (T != NULL){
if (T->lchild){
coutLeaf(T->lchild, sum);
}
if (T->rchild){
coutLeaf(T->rchild, sum);
}
//相当于后序遍历这棵树,计算叶子节点
if (T->lchild == NULL && T->rchild == NULL){
(*sum)++;
}
}
}
void test()
{
BiNode t1, t2, t3, t4, t5;
int sum = 0;
memset(&t1, 0, sizeof(BiNode));
memset(&t2, 0, sizeof(BiNode));
memset(&t3, 0, sizeof(BiNode));
memset(&t4, 0, sizeof(BiNode));
memset(&t5, 0, sizeof(BiNode));
t1.data = 1;
t2.data = 2;
t3.data = 3;
t4.data = 4;
t5.data = 5;
//建立树关系
t1.lchild = &t2; //t1的左孩子为t2
t1.rchild = &t3; //t1的右孩子为t3
t2.lchild = &t4; //t2的左孩子为t4
t3.lchild = &t5; //t3的左孩子为t5
coutLeaf(&t1, &sum);
printf("先序遍历 叶子节点个数为:%d\n", sum);
sum = 0;
coutLeaf02(&t1, &sum);
printf("中序遍历 叶子节点个数为:%d\n", sum);
sum = 0;
coutLeaf03(&t1, &sum);
printf("后序遍历 叶子节点个数为:%d\n", sum);
printf("三种遍历算法可知, 从递归的角度看, 这三种算法是完全相同的, 或者说这三种遍历算法的访问路径是相同的, 只是访问节点的时机不同\n");
}
#endif
#if 0
//2、 求树的高度(深度)
//树的高度 = 根节点的高度1 + max(左子树的高度, 右子树的高度)
int Depth(BiNode *T){
int deptleft = 0;
int deptright = 0;
int deptval = 0;
if (T == NULL){
deptval = 0;
return deptval;
}
//求左子树的高度
deptleft = Depth(T->lchild);
//求右子树的高度
deptright = Depth(T->rchild);
deptval = 1 + (deptleft > deptright ? deptleft : deptright);
return deptval;
}
/*
t1
/ \
t2 t3
/ /
t4 t5
*/
void test()
{
BiNode t1, t2, t3, t4, t5;
memset(&t1, 0, sizeof(BiNode));
memset(&t2, 0, sizeof(BiNode));
memset(&t3, 0, sizeof(BiNode));
memset(&t4, 0, sizeof(BiNode));
memset(&t5, 0, sizeof(BiNode));
t1.data = 1;
t2.data = 2;
t3.data = 3;
t4.data = 4;
t5.data = 5;
//建立树关系
t1.lchild = &t2; //t1的左孩子为t2
t1.rchild = &t3; //t1的右孩子为t3
t2.lchild = &t4; //t2的左孩子为t4
t3.lchild = &t5; //t3的左孩子为t5
printf("树的深度:%d\n",Depth(&t1));
}
#endif
//copy树 也是一个一个节点的复制
//先拷贝根节点,在拷贝左子树,拷贝右子树,注意指针域指向左右孩子
#if 1
//前序遍历 根左右 Preorder traversal
void preOrder(BiNode *root)
{
if (root == NULL){
return;
}
printf("%d ", root->data);//先打印根
//遍历左子树
preOrder(root->lchild);
//遍历右子树
preOrder(root->rchild);
}
BiNode * CopyTree(BiNode *T)
{
BiNode *newNode = NULL;
BiNode *newLp = NULL;
BiNode *newRp = NULL;
if (T == NULL){
return NULL;
}
//copy左子树
if (T->lchild != NULL){
newLp = CopyTree(T->lchild);
}
else{
newLp = NULL;
}
//copy右子树
if (T->rchild != NULL){
newRp = CopyTree(T->rchild);
}
else{
newRp = NULL;
}
//malloc 新节点
newNode = (BiNode*)malloc(sizeof(BiNode));
if (newNode == NULL){
return NULL;
}
newNode->lchild = newLp;
newNode->rchild = newRp;
newNode->data = T->data;
return newNode;
}
/*
t1
/ \
t2 t3
/ /
t4 t5
*/
void test()
{
BiNode t1, t2, t3, t4, t5;
memset(&t1, 0, sizeof(BiNode));
memset(&t2, 0, sizeof(BiNode));
memset(&t3, 0, sizeof(BiNode));
memset(&t4, 0, sizeof(BiNode));
memset(&t5, 0, sizeof(BiNode));
t1.data = 1;
t2.data = 2;
t3.data = 3;
t4.data = 4;
t5.data = 5;
//建立树关系
t1.lchild = &t2; //t1的左孩子为t2
t1.rchild = &t3; //t1的右孩子为t3
t2.lchild = &t4; //t2的左孩子为t4
t3.lchild = &t5; //t3的左孩子为t5
BiNode *root = CopyTree(&t1);
printf("\ncopy preorder\n");
preOrder(root);
}
#endif
int main()
{
test();
printf("\n---------hello\n");
system("pause");
}