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

树的遍历

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

算法伪码(已知树的前序s1,中序遍历s2,求后序遍历s3)

build(int n,int z,int[] s1,int s2[],int[] s3)
if n<=0
// 当前数组的长度为0时退出当前递归
    return;

s3[n+z-1] = s1[0]
//前序的第一位数字,既是后序的当前子树长度+偏移量 位的数字

 int p = searchFirst(lxr, xlr[0]);
//寻找 根节点,在中序中的位置,方便区分左右子树

build(p, z, s1[1,...p+1], s2[0,1...,p], s3);
// 左子树的遍历,左子树长度为p,偏移量不变

build(n - p - 1, z + p, s1[p+1,...], s2[p+1,....],s3);
// 右子树的遍历,右子树长度为n-p-1,偏移量为当前偏移量与左子树长度之和

树的遍历

public class TestB {

    public static void main(String[] args) {
        TestB t = new TestB();

        int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7 };
        TreeNode tree = new TreeNode();
        build(tree, a, 0);
        int[] xlr = new int[] { 1, 2, 5, 3, 6, 7 };
        int[] lxr = new int[] { 2, 5, 1, 6, 3, 7 };
        int[] lrx = new int[6];
        print(tree);
        System.out.println();
        t.build(6, 0, xlr, lxr, lrx);
        t.out(lrx);
    }

    private static class TreeNode {
        Integer val;
        TreeNode parent;
        TreeNode left;
        TreeNode right;

        public TreeNode() {
        }

        public TreeNode(Integer val) {
            this.val = val;
        }

        void print() {
            System.out.print(this.val + " ");
        }

        @Override
        public String toString() {
            return "TreeNode [val=" + val + ", parent=" + parent + ", left=" + left + ", right=" + right + "]";
        }
    }

    public static void build(TreeNode tree, int[] a, int num) {

        tree.val = a[0];
        tree.left = new TreeNode(a[1]);
        tree.right = new TreeNode(a[2]);

        tree.left.right = new TreeNode(a[4]);
        tree.right.left = new TreeNode(a[5]);
        tree.right.right = new TreeNode(a[6]);

    }

    public static void print(TreeNode tree) {
        if (tree == null) {
            return;
        }

        print(tree.left);

        print(tree.right);
        tree.print();
    }

    /**
     * 
     * @param n 子树数组长度
     * @param z 子树偏移长度
     * @param xlr 前序遍历子树
     * @param lxr 中序遍历子树
     * @param lrx 后续遍历子树
     */
    public void build(int n, int z, int[] xlr, int[] lxr, int[] lrx) {
        if (n <= 0 ) {
            return;
        }
        lrx[n + z - 1] = xlr[0];
        System.out.println(n + " --->  " + z + " --->  " + xlr[0]);
        int p = searchFirst(lxr, xlr[0]);

        // 左子树的遍历
        build(p, z, Arrays.copyOfRange(xlr, 1, p + 1), Arrays.copyOfRange(lxr, 0, p), lrx);

        // 右子树的遍历
        build(n - p - 1, z + p, Arrays.copyOfRange(xlr, p + 1, xlr.length), Arrays.copyOfRange(lxr, p + 1, lxr.length),lrx);
    }

    public int searchFirst(int[] a, int key) {

        for (int i = 0; i < a.length; i++) {
            if (a[i] == key) {
                return i;
            }
        }
        return -1;
    }

    public void out(int[] a) {
        for (int i : a) {
            System.out.print(i + " ");
        }
        System.out.println();
    }
}

转载于:https://my.oschina.net/u/3706181/blog/1604483

相关文章:

  • 菜鸟配置SAMBA服务之1
  • Qt动态设置布局中的控件
  • CISCO无线AP胖瘦升级
  • dotcms总结
  • 设计模式的原则
  • electron
  • 基于BIND实现DNS的解析、主从、子域、请求转发、访问控制
  • Mysql初始化root密码和允许远程访问
  • 软件项目隐形成本
  • MyBatis返回类型resultType和resultMap
  • 一个简单的git应用教程
  • CSS3 动画及过渡详解
  • wordpress模板文件及函数调用
  • linux之iptables详细配置
  • vue数据传递--我有特殊的实现技巧
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • iOS小技巧之UIImagePickerController实现头像选择
  • js
  • python 学习笔记 - Queue Pipes,进程间通讯
  • React-生命周期杂记
  • 安卓应用性能调试和优化经验分享
  • 记录:CentOS7.2配置LNMP环境记录
  • 讲清楚之javascript作用域
  • 前端js -- this指向总结。
  • 让你的分享飞起来——极光推出社会化分享组件
  • 数据仓库的几种建模方法
  • 线上 python http server profile 实践
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • k8s使用glusterfs实现动态持久化存储
  • ​插件化DPI在商用WIFI中的价值
  • ###C语言程序设计-----C语言学习(6)#
  • #pragma once
  • #stm32整理(一)flash读写
  • #前后端分离# 头条发布系统
  • #数学建模# 线性规划问题的Matlab求解
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $L^p$ 调和函数恒为零
  • (2)nginx 安装、启停
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (办公)springboot配置aop处理请求.
  • (分布式缓存)Redis哨兵
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (七)Java对象在Hibernate持久化层的状态
  • (顺序)容器的好伴侣 --- 容器适配器
  • (五)关系数据库标准语言SQL
  • (转)Google的Objective-C编码规范
  • *上位机的定义
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET Core 中插件式开发实现
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET轻量级ORM组件Dapper葵花宝典