二叉树先序建立,先序遍历,中序遍历,后序遍历,递归求二叉树深度,非递归求二叉树深度

这篇博客介绍了如何使用C语言创建并遍历二叉树,包括先序、中序和后序遍历,并提供了两种计算二叉树深度的方法。读者可以学习到二叉树的基本操作和递归、非递归算法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define MaxSize 50//定义MaxSize最大值为50
typedef int ElemType; //数据类型


//定义二叉树结构体
typedef struct BiTNode {
	ElemType data; //数据域
	struct BiTNode* lChild, * rChlid; //左右子树域
}BiTNode, * BiTree;


//先序创建二叉树
ElemType CreateBiTree(BiTree &T)
{
	ElemType ch;//输入二叉树数据
	scanf_s("%d", &ch);
	if (ch==0)//当数据为零时表示没有该叶子节点
		T = NULL;
	else
	{
		T = (BiTree)malloc(sizeof(BiTNode));//分配大小

		if (T !=NULL)//当树不为空时,先序遍历递归建立二叉树
		{
			T->data = ch;
			printf("输入%d的左子节点:", ch);
			CreateBiTree(T->lChild);
			printf("输入%d的右子节点:", ch);
			CreateBiTree(T->rChlid);
		}
	}
return 1;
}

void Visit(BiTree T)//打印二叉树元素
{
	printf("%d ", T->data);
}


//先序遍历二叉树
void TraverseBiTree(BiTree T)
{
	if (T==NULL)
		return;
	Visit(T);
	TraverseBiTree(T->lChild);
	TraverseBiTree(T->rChlid);


}



//中序遍历二叉树
void InOrderBiTree(BiTree T)
{
	if (NULL == T)
		return;
	InOrderBiTree(T->lChild);
	Visit(T);
	InOrderBiTree(T->rChlid);


}


//后序遍历二叉树
void PostOrderBiTree(BiTree T)
{
	if (NULL == T)
		return;
	PostOrderBiTree(T->lChild);
	PostOrderBiTree(T->rChlid);
	Visit(T);
}


//递归求二叉树的深度
int TreeDeep1(BiTree T)
{
	if (T == NULL)
		return 0;
	else
	{
		int leftdeep = TreeDeep1(T->lChild);
		int rightdeep = TreeDeep1(T->rChlid);
		if (leftdeep >= rightdeep)
			return leftdeep+1;
		else
			return rightdeep+1;
	}
}


int TreeDeep2(BiTree T) //非递归求二叉树深度
{
	if (T == NULL)//树空返回0
		return 0;
	else
	{
		BiTree Q[MaxSize];//定义一个足够储存树中所有元素的队列
		int front = -1, rear = -1;//front为队头,rear为队尾
		int last = 0, level = 0;//last指向当前层最右节点
		rear++;//指针加一头节点入队
		Q[rear] = T;
		BiTree P =NULL;//定义一个运动指针
		while (front < rear)
		{
			front++;//队头指针加一,队头元素出队
			P = Q[front];
			if (P->lChild != NULL)//左子树不为空,左孩子入队
			{
				rear++;
				Q[rear] = P->lChild;
			}
			if (P->rChlid != NULL)//右子树不为空,右孩子入队
			{
				rear++;
				Q[rear] = P->rChlid;
			}
			if (front == last)//处理该层最右节点
			{
				level++;//层数加一
				last = rear;//last指向下一层最右节点
			}

		}//else
		return level;//返回树的深度
	}//while

}


//主函数
int main(void)
{
	BiTree T;
	T = (BiTree)malloc(sizeof(BiTNode));
	while (1)
	{
		printf("\n**********输入接下来的操作**************\n");
		printf("         操作1:先序遍历建立二叉树\n");
		printf("         操作2:先序遍历打印二叉树\n");
		printf("         操作3:中序遍历打印二叉树\n");
		printf("         操作4:后序遍历打印二叉树\n");
		printf("         操作5:递归求二叉树深度\n");
		printf("         操作6:非递归求二叉树深度\n");
		printf("         操作-1:结束\n\n");
		int count =0;
		int deepth;
		printf(" *操作:");
		scanf_s("%d", &count);
		if (count == -1)
			break;
		switch (count)
		{
		case 1:
			printf("(请输入结点的值,0表示没有叶结点)\n");
			printf("输入第一个节点的值:");
			CreateBiTree(T);
			break;
		case 2:
			printf("先序遍历二叉树:");
			TraverseBiTree(T);
			printf("\n");
			break;
		case 3:
			printf("中序遍历二叉树:");
			InOrderBiTree(T);
			printf("\n");
			break;
		case 4:

			printf("后序遍历二叉树:");
			PostOrderBiTree(T);
			printf("\n");
			break;
		case 5:
			deepth = TreeDeep1(T);
			printf("树的深度为:%d", deepth);
			printf("\n");
			break;
		case 6:
			deepth = TreeDeep2(T);
			printf("树的深度为:%d", deepth);
			printf("\n");
			break;

		}
		
	}
	return 0;
}

运行示例:

在C语言中,给定一棵已知的二叉树序遍历(根节点 -> 左子树 -> 右子树)和中序遍历(左子树 -> 根节点 -> 右子树),我们可以通过递归的方式后序遍历(左子树 -> 右子树 -> 根节点)。这是因为前、中后序遍历之间存在一定的关联: 1. **后序遍历**的根节点在最后,所以我们可以通过以下步骤找到它: - 当遍历到当前节点时,如果它是序遍历的第一个素,那么它就是根节点。 - 接着,我们在中序遍历中查找该节点的位置。由于中序遍历节点位于左右子树之间,所以我们可以找到从当前开始的剩余部分,这部分就是中序遍历剩下的左子树和右子树。 - 对这个剩余部分分别进行后序遍历即可得到完整的后序遍历列。 下面是递归实现的伪代码示例: ```c struct TreeNode *findRoot(struct TreeNode *root, int preorder[], int size) { // 序遍历第一个素即为根节点 if (preorder[0] == root->val) return root; // 中序遍历找到根节点的位置 for (int i = 1; i < size; i++) { if (preorder[i] == root->val) { return findRoot(root->left, inorder, size); } } } void postorderTraversal(struct TreeNode *root, int inorder[], int size) { if (root == NULL) return; postorderTraversal(root->left, inorder, size); postorderTraversal(root->right, inorder, size); // 将找到的根节点添加到后序列的末尾 insertAtEnd(postorder, root->val); // 假设insertAtEnd()是一个函数用于将值追加到数组末尾 } ``` 这里假设`inorder[]`数组保存了中序遍历的结果,并且`postorder[]`数组用于存储最终的后序遍历结果。你需要根据实际情况调整这些操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值