【21】重建二叉树

简介: 题目:输入某个二叉树的前序遍历和中序遍历的结果,重建二叉树。假设输入的两个序列中都是没有重复数字的,例如输入前序序列{1,2,4,7,3,5,6,8},中序序列{4,7,2,1,5,3,8,6}分析:1. 在二叉树的前序序列中,第一个数总是二叉树的根结点的值。


题目:输入某个二叉树的前序遍历和中序遍历的结果,重建二叉树。假设输入的两个序列中都是没有重复数字的,例如输入前序序列{1,2,4,7,3,5,6,8},中序序列{4,7,2,1,5,3,8,6}


分析:

1. 在二叉树的前序序列中,第一个数总是二叉树的根结点的值。对应的如果把根节点的值在中序序列中找出来,则中序序列中位于根节点值的左边区间为左子树,右边为右子树

2. 根据题目假设的输入的两个序列是不重复的,因此我们可以利用扫描中序序列找到根节点,然后递归的建立二叉树即可

3. 利用一个BuildTree函数来返回BinaryTreeNode*,在函数内部利用new动态分配结点的内存,这样就不用担心函数返回栈区中分配的空间而使指针失效


//二叉树的结点
struct BinaryTreeNode{
    int value;
	BinaryTreeNode *lson;
	BinaryTreeNode *rson;
};

//重建二叉树
BinaryTreeNode* BuildTree(int *preOrder, int *inOrder, int n){
	//不合法的数据
	if(preOrder == NULL || inOrder == NULL || n <= 0){
	   return NULL;
	}
	BinaryTreeNode *root = new BinaryTreeNode();
	root->value = preOrder[0];
	root->lson = NULL;
	root->rson = NULL;
	//找到中序遍历中根节点的位置
	int index = 0;
	while(index < n && preOrder[0] != inOrder[index]){
	    ++index;
	}
	//不合法数据
	if(index >= n){
	    return NULL;
	}
	root->lson = BuildTree(preOrder+1, inOrder, index);
	root->rson = BuildTree(preOrder+1+index, inOrder+index+1, n-index-1);
	return root;
}


目录
相关文章
[剑指offer] 重建二叉树
本文首发于我的个人博客:尾尾部落 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
1073 0
重建二叉树(剑指offer 07)
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
119 0
重建二叉树(剑指offer 07)
剑指offer之重建二叉树
剑指offer之重建二叉树
150 0
剑指offer之重建二叉树
剑指offer-6.重建二叉树
剑指offer-6.重建二叉树
40 0
|
机器学习/深度学习 C++ Perl
剑指offer——重建二叉树
剑指offer——重建二叉树
115 0
剑指offer——重建二叉树
|
9月前
|
C++
【剑指offer】-重建二叉树-04/67
【剑指offer】-重建二叉树-04/67
|
Perl
剑指offer 06. 重建二叉树
剑指offer 06. 重建二叉树
56 0

热门文章

最新文章