您的位置:首页 > 其它

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5

2017-06-25 20:34 627 查看
剑指ofeer:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

解题思路:在二叉树的先序遍历中,第一个数字总是根节点的值。二叉树的中序遍历中,左子树的元素总是在根节点左边。由此两条,便可递归重构二叉树。代码如下:

#include "stdafx.h"
#include <vector>
#include <stack>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

#include <vector>
using namespace std;

//树结点结构体
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class solution{
public:
struct TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> in
4000
){
int in_size = in.size();
if(in_size == 0)//递归回头条件
return NULL;

int val = pre[0];//根节点的值就是先序遍历的第一元素
TreeNode* node = new TreeNode(val);
int p = 0;//p用来记录根节点在中序遍历中的位置

for (; p < in_size; ++p){

if (in[p] == val) //Find the root position in in

break;        //找到即跳出for循环

}

vector<int> pre_left, pre_right, in_left, in_right;// //分别存储先序序列的左子树,先序序列的右子树,中序序列的左子树,中序序列的右子树

for(int i = 0; i < in_size; i ++){
if(i < p){
in_left.push_back(in[i]);
pre_left.push_back(pre[i+1]);
}
else if(i > p){
in_right.push_back(in[i]);
pre_right.push_back(pre[i]);

}
}
node->left = reConstructBinaryTree(pre_left,in_left);//分别递归
node->right = reConstructBinaryTree(pre_right,in_right);
return node;

};
};

void Test1()
{
const int length = 8;
int preorder[8] = { 1, 2, 4, 7, 3, 5, 6, 8 };
int inorder[8] = { 4, 7, 2, 1, 5, 3, 8, 6 };
vector<int> pre_vec(&preorder[0],&preorder[8]);
vector<int> in_vec(&inorder[0],&inorder[8]);
/* for(int i = 0; i < length; i++){
pre.push_back(preorder[i]);
in.push_back(inorder[i]);
}*/

solution s;
TreeNode* node;
node = s.reConstructBinaryTree(pre_vec,in_vec);

int a=0;
a++;
}

int main()
{
Test1();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐