• 剑指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
  • 相关阅读:
    使用SQL语句创建SQL数据脚本(应对万网主机部分不支持导出备份数据)
    js和jquery页面初始化加载函数的方法及先后顺序
    熔断器原理
    List<T>线性查找和二分查找BinarySearch效率分析
    ASP.NET资源大全-知识分享 【转载】
    C#语法——委托,架构的血液
    SUPERSOCKET 客户端
    VS 中的几种注释方法
    计算机专业术语中英文对照
    2018服务端架构师技术图谱
  • 原文地址:https://www.cnblogs.com/hrnn/p/13344511.html
Copyright © 2020-2023  润新知