【剑指offer】重构二叉树 python+C++

420 阅读1分钟

【题目描述】

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

【思路】

利用递归,每一轮递归中找到当前根节点并返回;至于根节点的左右子节点就根据递归得到,找到前序序列pre与中序序列tin所对应二叉树的根节点(pre[0])之后,再根据tin就能够确定左子树前序序列preleft与中序序列tinleft和右子树的前序序列preright与中序序列tinright,作为递归的参数即可。

【代码】

C++:
 /**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        int length=pre.size();
        if (length==0){
            return NULL;
        }
        TreeNode* head=new TreeNode(pre[0]);
        int head_index=0;
        for(int i=0;i<length;i++){
            if(vin[i]==pre[0]){
                head_index=i;
                break;
            }
        }
        vector<int> preleft,preright,vinleft,vinright;
        for(int i=0;i<head_index;i++){
            preleft.push_back(pre[i+1]);
            vinleft.push_back(vin[i]);
        }
        for(int i=head_index+1;i<length;i++){
            preright.push_back(pre[i]);
            vinright.push_back(vin[i]);
        }
        head->left=reConstructBinaryTree(preleft,vinleft);
        head->right=reConstructBinaryTree(preright,vinright);
        return head;
    }
};
Python:
class Solution:
    # 返回构造的TreeNode根节点
    def reConstructBinaryTree(self, pre, tin):
        length=len(pre)
        if length==0:
            return None
        head=TreeNode(pre[0])
        head_index=tin.index(pre[0])
        pre_left=pre[1:head_index+1]
        tin_left=tin[0:head_index]
        pre_right=pre[head_index+1:]
        tin_right=tin[head_index+1:]
        head.left=self.reConstructBinaryTree(pre_left,tin_left)
        head.right=self.reConstructBinaryTree(pre_right,tin_right)
        return head