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

二叉树的一些基础算法(先序,中序,后序,层次,深度,宽度,距离)

二叉树的一些基础算法

开始准备面试了,不定期更新一下更种各样的数据结构,记录一下吧。

  1. 先序遍历,递归算法。
  2. 中序遍历,递归算法。
  3. 后序遍历,递归算法。
  4. 先序遍历,非递归算法。
  5. 中序遍历,非递归算法。
  6. 后序遍历,非递归算法。
  7. 二叉树的层次遍历。
  8. 求二叉树的宽度
  9. 求二叉树的深度
  10. 求二叉树最远两个节点的距离。

0.二叉树节点

public class Node {
    public int value;
    public Node leftNode;
    public Node rightNode;
    
    //深度 用于求二叉树深度
    public int deep;
    
    //是否访问 用于后序遍历二叉树
    public int visit;
    
    //左右最远距离 用于求二叉树最远两个节点间距离
    public int leftLen;
    public int rightLen;
    
    public Node(int value) {
        this.value = value;
    }
    
    public Node(int value, Node left, Node right) {
        this.value = value;
        this.leftNode = left;
        this.rightNode = right;
    }

    @Override
    public String toString() {
        return "Node [value=" 
        + value + ", visit=" + visit + "]";
    }
}

1.先序遍历,递归算法

public static void preOrder(Node n) {
    if(n == null) {
        return;
    }
    System.out.println(n);
    preOrder(n.leftNode);
    preOrder(n.rightNode);
}

2.中序遍历,递归算法

public static void InOrder(Node n) {
    if(n == null) {
        return;
    }
    InOrder(n.leftNode);
    System.out.println(n);
    InOrder(n.rightNode);
}

3.中序遍历,递归算法

public static void postOrder(Node n) {
    if(n == null) {
        return;
    }   
    postOrder(n.leftNode);
    postOrder(n.rightNode);
    System.out.println(n);
}

4.先序遍历,非递归算法

非递归算法运用了栈的思想。

public static void preOrderStack(Node n) {
    Stack<Node> stack = new Stack<Node>();
    
    while(n != null || !stack.isEmpty()) {
        while(n != null) {
            System.out.println(n);
            stack.push(n);
            n = n.leftNode;
        }
        if(!stack.isEmpty()) {
            n = stack.pop();
            n = n.rightNode;
        }
        
    }
}

5.中序遍历,非递归算法

public static void inOrderStack(Node n) {
    Stack<Node> stack = new Stack<Node>();
    while(n != null || !stack.isEmpty()) {
        while(n != null) {
            stack.push(n);
            n = n.leftNode;
        }
        if(!stack.isEmpty()) {
            n = stack.pop();
            System.out.println(n);
            n = n.rightNode;
        }
    }
}

6.后序遍历,非递归算法

设置一个访问变量来判断节点的右子树是否已经访问。

public static void postOrderStack(Node n) {
    Stack<Node> stack = new Stack<Node>();
    while(n != null || !stack.isEmpty()) {
        while(n != null) {
            stack.push(n);
            n = n.leftNode;
        }
        while(!stack.empty() 
            && stack.peek().visit == 1) {
            System.out.println(stack.pop());
        }
        
        if(!stack.empty()) {
            n = stack.peek();
            n.visit = 1;
            n = n.rightNode;
        }
    }
}

7.二叉树的层次遍历

二叉树的层次遍历运用队列的思想。

public static void levelOrder(Node n) {
    if(n == null) {
        return;
    }
    Queue<Node> queue = new ArrayDeque<Node>();
    queue.add(n);
    
    while(queue.size() > 0) {
        n = queue.poll();
        System.out.println(n);
        if(n.leftNode != null) {
            queue.add(n.leftNode);
        }
        if(n.rightNode != null) {
            queue.add(n.rightNode);
        }
    }
}

8.求二叉树宽度

二叉树的宽度指的是,二叉树的每一层的节点数最多有多少。
思想与二叉树层次遍历相似。

public static int width(Node n) {
    Queue<Node> queue = new ArrayDeque<Node>();
    int maxWidth = 1;
    queue.add(n);
    
    while(queue.size() > 0) {
        int len = queue.size();
        while(len > 0) {
            n = queue.poll();
            len--;
            if(n.leftNode != null) {
                queue.add(n.leftNode);
            }
            if(n.rightNode != null) {
                queue.add(n.rightNode);
            }
        }
        maxWidth = Math.max(maxWidth, queue.size());
    }
    return maxWidth;
}

9.求二叉树深度

public static int deep(Node n) {
    if(n == null) {
        return 0;
    }
    int l = deep(n.leftNode);
    int r = deep(n.rightNode);
    if(l > r) {
        return l + 1;
    }
    return r + 1;
}

10.求二叉树最远两个节点的距离

求每个节点的左右长度,相加+1与最大距离相比。

public static int len(Node n, int maxValue) {
    if(n == null) {
        return 0;
    }
    if(n.leftNode == null) {
        n.leftLen = 0;
    }
    if(n.rightNode == null) {
        n.leftLen = 0;
    }
    if(n.leftNode != null) {
        len(n.leftNode, maxValue);
    }
    if(n.rightNode != null) {
        len(n.rightNode, maxValue);
    }
    
    if(n.leftNode != null) {
        if(n.leftNode.leftLen > n.leftNode.rightLen) {
            n.leftLen = n.leftNode.leftLen + 1;
        } else {
            n.leftLen = n.leftNode.rightLen + 1;
        }
    }
    
    if(n.rightNode != null) {
        if(n.rightNode.leftLen > n.rightNode.rightLen) {
            n.rightLen = n.rightNode.leftLen + 1;
        } else {
            n.rightLen = n.rightNode.rightLen + 1;
        }
    }
    
    if(n.leftLen + n.rightLen + 1 > maxValue) {
        maxValue = n.leftLen + n.rightLen + 1;
    }
    return maxValue;
}

转载于:https://www.cnblogs.com/yuekx/p/5107357.html

相关文章:

  • 桌面宠物,3只可爱的小猫
  • gcc预处理、编译、链接简述
  • 《jQuery基础教程:第2版》PDF
  • 《C#入门经典》(第4版)
  • Python批量删除指定目录下的指定类型的文件
  • Xcode-程序开发设计-02九宫格
  • C语言程序设计(第二版) 谭浩强下载- 免费电子书|电子书下载
  • 深入理解数据库磁盘存储(Disk Storage)
  • Android 程序员指南 PDF下载
  • nodejs review-04
  • 扩展方法
  • Readiris Pro 12 中文版- 专业OCR扫描软件
  • 如何设计好类的接口
  • 最好的FLV视频下载器 维棠 (支持优酷视频下载、土豆视频下载等)
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • 2017 年终总结 —— 在路上
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • android图片蒙层
  • Druid 在有赞的实践
  • js中forEach回调同异步问题
  • leetcode98. Validate Binary Search Tree
  • Mac转Windows的拯救指南
  • mysql innodb 索引使用指南
  • Rancher如何对接Ceph-RBD块存储
  • sessionStorage和localStorage
  • Twitter赢在开放,三年创造奇迹
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • windows下mongoDB的环境配置
  • 高程读书笔记 第六章 面向对象程序设计
  • 思维导图—你不知道的JavaScript中卷
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 在Unity中实现一个简单的消息管理器
  • AI算硅基生命吗,为什么?
  • 仓管云——企业云erp功能有哪些?
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #100天计划# 2013年9月29日
  • #ifdef 的技巧用法
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (3)选择元素——(17)练习(Exercises)
  • (LeetCode) T14. Longest Common Prefix
  • (Matlab)使用竞争神经网络实现数据聚类
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (算法)Travel Information Center
  • (一)appium-desktop定位元素原理
  • (一)u-boot-nand.bin的下载
  • (转) 深度模型优化性能 调参
  • (转)c++ std::pair 与 std::make
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)memcache、redis缓存
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转载)(官方)UE4--图像编程----着色器开发
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布