当前位置: 首页 > news >正文

根据先序和中序构造二叉树

为什么80%的码农都做不了架构师?>>>   hot3.png

 Construct Binary Tree from Preorder and Inorder Traversal

问题:

Given preorder and inorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

解决:

【解析】对于下面的这棵树:

红色是根节点,蓝色为左子树,绿色为右子树。

可以发现的规律是:
1. 先序遍历的从左数第一个为整棵树的根节点。
2. 中序遍历中根节点是左子树右子树的分割点

① 给定先序遍历结果和中序遍历结果,构造一棵二叉树。采用递归的方式解决该问题:
    a) 通过先序遍历找到第一个点作为根节点,在中序遍历中找到根节点并记录index;
    b) 因为中序遍历中根节点左边为左子树,所以可以记录左子树的长度并在先序遍历中依据这个长度找到左子树的区间,用同样方法可以找到右子树的区间。
    c) 递归的建立好左子树和右子树就好。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution { //18ms
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        int preLen = preorder.length;
        int inLen = inorder.length;
        return buildTree(preorder,0,preLen - 1,inorder,0,inLen - 1);
    }
    public TreeNode buildTree(int[] preorder,int preStart,int preEnd,int[] inorder,int inStart,int inEnd){
        if(preStart > preEnd || inStart > inEnd){
            return null;
        }
        int rootVal = preorder[preStart];
        int rootIndex = 0;
        for (int i = inStart;i <= inEnd ;i ++ ) {
            if(inorder[i] == rootVal){
                rootIndex = i;
                break;
            }
        }
        int llen = rootIndex - inStart;
        TreeNode root = new TreeNode(rootVal);
        root.left = buildTree(preorder,preStart + 1,preStart + llen,inorder,inStart,rootIndex - 1);
        root.right = buildTree(preorder,preStart + llen + 1,preEnd,inorder,rootIndex + 1,inEnd);

        return root; 
    }
}

② 在discuss中看到的,从两边向中间查找。

class Solution { //1ms
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return buildTree(preorder,0,inorder,0,inorder.length - 1);
    }
    public TreeNode buildTree(int[] preorder,int preStart,int[] inorder,int inStart,int inEnd){
        if(inStart > inEnd){
            return null;
        }
        TreeNode root = new TreeNode(preorder[preStart]);
        int rootIndex = -1;
        for (int k = inStart,l = inEnd;k <= l ;k ++,l -- ) {//从两边向中间查找根节点
            if(inorder[k] == root.val) {
                rootIndex = k;
                break;
            } else if(inorder[l] == root.val) {
                rootIndex = l;
                break;
            }
        }
        root.left = buildTree(preorder,preStart + 1,inorder,inStart,rootIndex - 1);
        root.right = buildTree(preorder,preStart + rootIndex - inStart + 1,inorder,rootIndex + 1,inEnd);

        return root;
    }
}

转载于:https://my.oschina.net/liyurong/blog/1539493

相关文章:

  • 重磅发布背后:POLARDB的中国故事
  • iOS开发视频教程下载/iphone开发视频教程下载
  • 王者荣耀是怎样炼成的(二)《王者荣耀》unity安装及使用的小白零基础入门...
  • Mesos将使用统一的容器管理器支持多种容器类型
  • 程序员强子
  • “The Stupidity Paradox”作者访谈
  • Linux 下安装Redis 3.0.0
  • 关于C#中的动态数组ArrayList
  • MyBatis全局配置文件MyBatis-config.xml代码
  • 初识 webpack
  • ASP .Net Core 使用 Dapper 轻型ORM框架
  • C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】
  • 如何使用公司打印机打印双页
  • JetBrains激活
  • [EWS]查找 文件夹
  • co模块的前端实现
  • ES2017异步函数现已正式可用
  • golang中接口赋值与方法集
  • Intervention/image 图片处理扩展包的安装和使用
  • JavaScript设计模式之工厂模式
  • k8s如何管理Pod
  • mysql中InnoDB引擎中页的概念
  • php的插入排序,通过双层for循环
  • Spring核心 Bean的高级装配
  • Vue 重置组件到初始状态
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 基于遗传算法的优化问题求解
  • 前端面试题总结
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 怎么把视频里的音乐提取出来
  • 昨天1024程序员节,我故意写了个死循环~
  • #NOIP 2014#Day.2 T3 解方程
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (C语言)逆序输出字符串
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (六)vue-router+UI组件库
  • (算法)N皇后问题
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)winform之ListView
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .net 微服务 服务保护 自动重试 Polly
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET关于 跳过SSL中遇到的问题
  • .NET下ASPX编程的几个小问题
  • 。Net下Windows服务程序开发疑惑
  • @Documented注解的作用
  • @GlobalLock注解作用与原理解析
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [20190113]四校联考
  • [Android]Android开发入门之HelloWorld
  • [Angular 基础] - 表单:响应式表单
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [bzoj 3124][sdoi 2013 省选] 直径