剑指offer--4.重建二叉树

来源:互联网 发布:淘宝贷款上征信吗 编辑:程序博客网 时间:2024/05/21 10:18

题目描述

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

实现思想:递归方式。左右子树递归处理

/*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 length = pre.size();        if (pre.empty() || in.empty() || length <= 0)            return NULL;        //构建根节点        TreeNode* root = new TreeNode(pre[0]);        //递归的终点,到叶子节点,退出递归,打印root        if (pre.size() == 1 && in.size() == 1 && pre[0]==in[0])            //叶子节点            return root;        //中序遍历求根位置        //rootIn=中序遍历中root节点的位置        auto rootIn = find(in.begin(), in.end(), root->val);        int leftLen = rootIn-in.begin();        if (leftLen>0)        {            //左子树leftLen            //vector在初始化时,迭代器的最后一个参数为尾后指针。            vector<int> inLeft(in.begin(), rootIn);            vector<int> preLeft(pre.begin() + 1, pre.begin() + leftLen + 1);            root->left=reConstructBinaryTree(preLeft, inLeft);        }        if (leftLen<pre.size())        {            //右子树rightLen            vector<int> inRight(rootIn + 1, in.end());            vector<int> preRight(pre.begin() + leftLen + 1, pre.end());            root->right=reConstructBinaryTree(preRight, inRight);        }           //分支节点&根节点        return root;                        }};
0 0
原创粉丝点击