PTA 还原二叉树

本文讲述了如何通过题目给出的前序遍历和中序遍历结果反推出二叉树结构,并介绍了如何递归地创建和计算树的高度。作者给出了C++代码示例来实现这一过程。
摘要由CSDN通过智能技术生成

解题思路:

解这道题的关键在于通过题目给出的前序和中序遍历的输出结构来反推二叉树的构造。这就需要我们了解前序和中序遍历的原则。

简单来说,前序就是根左右,中序就是左根右。通过他前序遍历规则我们可以知道,即使树移除了一个点(在保证树结构不被破坏的情况下,或者直接分裂成一棵新树),前序遍历的第一个输出仍然是根节点;而通过中序遍历的规则我们可以知道,根节点左边是左子树,右边是右子树。这题就是不断找根节点,将通过中序遍历输出将根节点左右分开,充当新的左子树和右子树,并将左右子树的根节点分别充当当前节点的左右结点,不会丢失数据。(字面上不太好理解,可以自己画一个图,一步步推,这样很好理解)。

查树有多少层,这里我就不讲了,这个很容易,直接递归。

下面是代码:

#include<iostream>
using namespace std;
typedef struct node {
	int data;
	node* left, * right;
}tree;
node* createtree(char* pre, char* in, int n)
{
	int k = 0;
	char* tmp;
	if (n <= 0)
		return NULL;
	node* t;
	t = (node*)malloc(sizeof(node));
	t->data = *pre;
	for (tmp = in; tmp < in + n; tmp++)
	{
		if (*tmp == *pre)
			break;
	}
	k = tmp - in;
	t->left = createtree(pre + 1, in, k);
	t->right = createtree(pre + k+1, tmp+ 1, n - k - 1);
	return t;
}
int height(tree* t)
{
	int lchild, rchild;
	if (t == NULL)
		return 0;
	else
	{
		lchild = height(t->left);
		rchild = height(t->right);
		return (lchild > rchild ? (lchild + 1) : (rchild + 1));
	}
}
int main()
{
	int n;
	cin >> n;
	char pre[51], in[51];
	for (int i = 0; i < n; i++)
		cin >> pre[i];
	for (int i = 0; i < n; i++)
		cin >> in[i];
	tree* t;
	t = createtree(pre, in, n);
	int result = height(t);
	cout << result;

}

运行结果:

有优化请给我留言,谢谢。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值