剑指offer 重建二叉树

来源:互联网 发布:淘宝浩升软件什么用途 编辑:程序博客网 时间:2024/05/22 20:27

重建二叉树

题目描述

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

我的解答

首先先序和中序,中序和后序,中序和层次序可以唯一确定一颗二叉树,这里题目给的先序和中序,那么如何确定二叉树呢,首先是找到根,然后将左右子树分开,最后递归就可以了。大致思路如图。
这里写图片描述
通过的代码如下。

#include <iostream>#include <cstdio>#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) {        //判出条件(可以这么写,有两个为空,则返回NULL)        int preSize = pre.size(), inSize = in.size();        if(preSize==0 && inSize==0) return NULL;        //寻找根节点        int head = pre[0];  int k;        for(k=0; k<inSize; k++){            if(in[k] == head){                break;            }        }        //重新建立vector,递归。        vector<int> preLeft, preRight, inLeft, inRight;        for(int i=1; i<=k; i++)  preLeft.push_back(pre[i]);        for(int i=k+1; i<preSize; i++)  preRight.push_back(pre[i]);        for(int i=0; i<k; i++)  inLeft.push_back(in[i]);        for(int i=k+1; i<inSize; i++)   inRight.push_back(in[i]);        TreeNode *root = new TreeNode(head);        if(preSize != 0)            root->left = reConstructBinaryTree(preLeft, inLeft);        if(inSize != 0)            root->right = reConstructBinaryTree(preRight, inRight);        return root;    }    void postOrder(TreeNode *root){        if(root->left)            postOrder(root->left);        if(root->right)            postOrder(root->right);        printf("%d", root->val);    }};int main() {    Solution s;    vector<int> pre, in;    pre.push_back(1);   pre.push_back(2);    pre.push_back(4);   pre.push_back(7);    pre.push_back(3);   pre.push_back(5);    pre.push_back(6);   pre.push_back(8);    in.push_back(4);    in.push_back(7);    in.push_back(2);    in.push_back(1);    in.push_back(5);    in.push_back(3);    in.push_back(6);    in.push_back(8);    TreeNode* root = s.reConstructBinaryTree(pre, in);    s.postOrder(root);    return 0;}
0 0