• 4.重建二叉树


    题目描述:

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

    思路分析:

    ​  该题是二叉树问题,我们首先想到的就是用递归的方法去解决该问题,我们知道二叉树的先序遍历,数组的首元素一定是该二叉树的根节点,因此我们可以先确定根节点,然后中序遍历是先访问左子树然后访问根,最后访问右子树。因此当我们通过先序遍历确定根节点后,在中序序列中搜索找到根节点,那么此时中序序列中根节点左边的所有节点构成了二叉树当前根节点左子树的中序序列,右边是右子树的中序序列,同理可以在先序序列中找到左子树的先序序列和右子树的先序序列,这样我们就将问题的规模缩小到了重构左右子树,因此我们可以用递归的方法解决该问题。

    代码:

    import java.util.*;
    public class Solution {
        public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
            if(pre==null||in==null||pre.length==0||in.length==0)  //递归终止条件
                return null;
            TreeNode root=new TreeNode(pre[0]);    //找到根节点
            int i=0;
            for(;i<in.length;i++){
                if(in[i]==pre[0])
                    break;
            }
            int []leftpre=Arrays.copyOfRange(pre,1,i+1);   //左子树先序序列
            int []leftin=Arrays.copyOfRange(in,0,i);       //左子树中序序列
            int []rightpre=Arrays.copyOfRange(pre,i+1,pre.length);  //右子树先序序列
            int []rightin=Arrays.copyOfRange(in,i+1,in.length);      //右子树先序序列
            root.left=reConstructBinaryTree(leftpre,leftin);
            root.right=reConstructBinaryTree(rightpre,rightin);
            return root;
        }
    }
    
  • 相关阅读:
    [算法] 神秘数
    教你在Access数据库中如何使用SQL
    亚宇工资管理系统早年制作的一个很小的商业软件[源码和软件截图]
    亚宇工资管理系统早年制作的一个很小的商业软件[源码和软件截图]
    getkeyTw
    一个硬盘的感人的爱情故事!只此一篇
    码农如何快速打造一个有设计感的网站
    NK.bin和NK.nb0学习
    WINCE6.0 + S3C2443的启动过程nboot篇
    S3C2443时钟管理
  • 原文地址:https://www.cnblogs.com/yjxyy/p/10688495.html
Copyright © 2020-2023  润新知