二叉树中序遍历递归算法,求树的高度,以及拷贝树


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct BiTNode
{
	int date;
	struct BiTNode *lchild, *rchild;//二叉树左枝,右枝
}BiTNode;

void inOrder(BiTNode *root)//中序遍历递归算法
{
	if (root == NULL)
	{
		return;
	}
	inOrder(root->lchild);//遍历左枝
	printf("%d  ", root->date);//打印节点
	inOrder(root->rchild);//遍历右枝
}

int Depth(BiTNode * root)//递归求树的高度
{
	int DepthLeft = 0;//左树高度
	int DephRight = 0;//右树高度
	int DepthLast = 0;//最后树的高度
	if (root == NULL)
	{
		return 0;
	}
	DepthLeft = Depth(root->lchild);
	DephRight = Depth(root->rchild);
	DepthLast = 1 + (DepthLeft > DephRight ? DepthLeft : DephRight);
	
	return DepthLast;
}

BiTNode * CopyTree(BiTNode * root)
{
	if (root == NULL)
	{
		return NULL;
	}
	BiTNode * NewNode = NULL;
	BiTNode * NewLef = NULL;
	BiTNode * NewRig = NULL;

	

	if (root->lchild != NULL)
	{
		NewLef = CopyTree(root->lchild);
	}
	else
	{
		NewLef = NULL;
	}


	if (root->rchild != NULL)
	{
		NewRig = CopyTree(root->rchild);
	}
	else
	{
		NewRig = NULL;
	}

	NewNode = (BiTNode *)malloc(sizeof(BiTNode));
	if (NewNode == NULL)
	{
		return NULL;
	}
	NewNode->lchild = NewLef;
	NewNode->rchild = NewRig;
	NewNode->date = root->date;

	return NewNode;


}
void 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.date = 1;
	t2.date = 2;
	t3.date = 3;
	t4.date = 4;
	t5.date = 5;
	t1.lchild = &t2;
	t1.rchild = &t3;
	t2.rchild = &t4;
	t3.lchild = &t5;
	
	int height = Depth(&t1);
	printf("树的高度:%d\n",height);

	printf("*********************\n递归算法中序遍历:\n");
	inOrder(&t1);
	printf("\n*********************\n");

	BiTNode *tmp = NULL;
	tmp = CopyTree(&t1);
	printf("*********************\n递归算法中序遍历:\n");
	inOrder(tmp);
	printf("\n*********************\n");

	


	system("pause");



}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值