剑指04重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
 
import java.util.Arrays;
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        //数组长度为0的时候要处理
        if (pre.length==0){
            return null;
        }
        int rootVal=pre[0];
        //数组长度仅为1的时候就要处理
        if (pre.length==1){
            return new TreeNode(rootVal);
        }
        
        //先找到root所在位置的范围,确定好前序和中序中左子树和右子树序列的范围
        TreeNode root=new TreeNode(rootVal);
        int rootIndex=0;
        for (int i=0;i<in.length;i++){
            if (rootVal==in[i])
            {
                rootIndex=i;
                break;
            }
        }
        root.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,rootIndex+1),Arrays.copyOfRange(in,0,rootIndex));
        root.right=reConstructBinaryTree(Arrays.copyOfRange(pre,rootIndex+1,pre.length),Arrays.copyOfRange(in,rootIndex+1,in.length));
                                         
        return root;
    }
}
 
/**
 * 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> in) {
        int inlen=in.size();
        if (inlen==0)
            return NULL;
        vector <int> left_pre,right_pre,left_in,right_in;
        //创建根节点,根节点肯定是前序遍历的第一个数
        TreeNode *head=new TreeNode(pre[0]);
        //找到中序遍历根节点所在位置,存放于变量gen中
        int gen=0;
        for (int i=0;i<inlen;i++){
            if (in[i]==pre[0])
            {
                gen=i;
                break;
            }
        }
     //对于中序遍历,根节点左边的节点位于二叉树的左边,根节点的右边的节点位于二叉树的右边
        for  (int i=0;i<gen;i++)
        {
            left_in.push_back(in[i]);
            left_pre.push_back(pre[i+1]);//前序第一个为根节点
            
        }
        for (int i=gen+1;i<inlen;i++){
            right_in.push_back(in[i]);
            right_pre.push_back(pre[i]);
        }
        head->left=reConstructBinaryTree(left_pre, left_in);
        head->right=reConstructBinaryTree(right_pre, right_in);
        return head;
    }
};
 
# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回构造的TreeNode根节点
    def reConstructBinaryTree(self, pre, tin):
        # write code here
        if len(pre)==0:
            return None
        if len(pre)==1:
            return  TreeNode(pre[0])
        else:
            flag=TreeNode(pre[0])
            flag.left=self.reConstructBinaryTree(pre[1:tin.index(pre[0])+1], tin[:tin.index(pre[0])])
            flag.right=self.reConstructBinaryTree(pre[tin.index(pre[0])+1:], tin[tin.index(pre[0])+1:])
        return flag
posted on 2020-07-20 13:17  滚雪球效应  阅读(123)  评论(0编辑  收藏  举报