树的应用:求树的叶子节点数 求树的高度、copy一棵树

#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");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值