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

来源:互联网 发布:怎么领取淘宝客优惠券 编辑:程序博客网 时间:2024/06/06 01:38

剑指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){         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; }


阅读全文
0 0
原创粉丝点击