重建二叉树

来源:互联网 发布:淘宝网智能手机 编辑:程序博客网 时间:2024/06/18 09:25

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

思想:前序遍历的第一个节点肯定是根节点。然后根据值比较,遍历中序遍历序列,把根节点值的左边划分为左子树,右边划分为右子树。然后递归实现。

/** * 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) {        if(pre.size() == 0 && pre.size() != in.size()) return NULL;<span style="white-space:pre"></span>//两个序列不能为空,且必须相等        struct TreeNode* root =new TreeNode(pre[0]);        root->val = pre[0];        vector<int> left_pre,left_in;        vector<int> right_pre,right_in;        size_t i;<span style="white-space:pre"></span>//vector的下标用的是size_t类型,就是无符号整数类型        for(i=0;i<in.size()&&in[i]!=pre[0];i++)        {                            left_in.push_back(in[i]);<span style="white-space:pre"></span>//划分左子树的中序遍历序列                left_pre.push_back(pre[i+1]);<span style="white-space:pre"></span>//划分左子树的前序遍历序列,它的下标是从1开始        }        i += 1;<span style="white-space:pre"></span>//i此时的指向根节点值的下标,所以要加1越过根节点
        for(i;i<in.size();i++)        {            right_in.push_back(in[i]);<span style="white-space:pre"></span>//同上            right_pre.push_back(pre[i]);<span style="white-space:pre"></span>//右子树部分因为已经越过根节点,所以下标已经同步        }        if(left_pre.size() != 0)            root->left = this->reConstructBinaryTree(left_pre,left_in);        if(right_pre.size() != 0)            root->right = this->reConstructBinaryTree(right_pre,right_in);        return root;    }};添加笔记


0 0
原创粉丝点击