剑指offer—重建二叉树

华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/9/30

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

解析:这篇博客把三种情况都给总结了,看着更清楚。
http://blog.csdn.net/zhangzhengyi03539/article/details/48298679

/** * Definition for binary tree * 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) {
        return ContructRoot(pre, in);
    }
    struct TreeNode* ContructRoot(vector<int> pre, vector<int> in)
    {
        TreeNode* root = new TreeNode(pre.front());
        pre.erase(pre.begin());
        vector<int> leftpre,rightpre,leftin,rightin;
        bool pass = false;
        while (in.empty()==false)
        {
            if (in.front() == root->val)
            {
                pass = true;
                in.erase(in.begin());
            }
            else
            {
                if (pass == false)
                {
                    leftpre.push_back(pre.front());
                    leftin.push_back(in.front());
                }
                else
                {
                    rightpre.push_back(pre.front());
                    rightin.push_back(in.front());
                }
                pre.erase(pre.begin());
                in.erase(in.begin());
            }
        }
        root->left = leftpre.size() > 0 ? ContructRoot(leftpre, leftin) : NULL;
        root->right = rightpre.size() > 0 ? ContructRoot(rightpre, rightin) : NULL;
        return root;
    }
};

你可能感兴趣的:(剑指offer—重建二叉树)