二叉树 遍历 先序 中序 后序 深度 广度 MD
| Markdown版本笔记 | 我的GitHub首页 | 我的博客 | 我的微信 | 我的邮箱 | 
|---|---|---|---|---|
| MyAndroidBlogs | baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com | 
二叉树 遍历 先序 中序 后序 深度 广度 MD
目录
二叉树遍历
测试案例

遍历结果:
先序遍历:631254978
中序遍历:123456789
后序遍历:214538796
广度优先:639157248
构造二叉树
public static Node init() {
    //注意必须逆序建立,先建立子节点,再逆序往上建立,因为非叶子结点会使用到下面的节点
    Node J = new Node(8, null, null);
    Node H = new Node(4, null, null);
    Node G = new Node(2, null, null);
    Node F = new Node(7, null, J);
    Node E = new Node(5, H, null);
    Node D = new Node(1, null, G);
    Node C = new Node(9, F, null);
    Node B = new Node(3, D, E);
    Node A = new Node(6, B, C);
    return A; //返回根节点
}结点定义
class Node {
    public int value;
    public Node left;
    public Node right;
    public Node(int value, Node left, Node right) {
        this.value = value;
        this.left = left;
        this.right = right;
    }
}深度优先 Depth First Search
使用递归遍历
其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
public static void preOrderTraversal(Node root) {
    if (root != null) {
        System.out.print(root.value); //先(根)序遍历
        preOrderTraversal(root.left); //递归遍历左孩子
        preOrderTraversal(root.right); //递归遍历右孩子
    }
}
public static void inOrderTraversal(Node root) {
    if (root != null) {
        inOrderTraversal(root.left);
        System.out.print(root.value); //中(根)序遍历
        inOrderTraversal(root.right);
    }
}
public static void postOrderTraversal(Node root) {
    if (root != null) {
        postOrderTraversal(root.left);
        postOrderTraversal(root.right);
        System.out.print(root.value); //后(根)序遍历
    }
}使用栈遍历
public static void preOrderTraversalStack(Node root) {
    Stack<Node> stack = new Stack<>();
    while (root != null || !stack.isEmpty()) {
        if (root != null) {
            System.out.print(root.value); //压栈之前先访问,先序遍历
            stack.push(root); //压栈
            root = root.left; //访问左叶子节点
        } else { //没有左(右)叶子节点
            root = stack.pop(); //返回最近压入栈的结点【核心】
            root = root.right; //访问右叶子节点
        }
    }
}
public static void preOrderTraversalStack2(Node root) {
    Stack<Node> stack = new Stack<>();
    stack.push(root);
    while (!stack.isEmpty()) {
        Node node = stack.pop();
        System.out.print(node.value); //先序遍历
        if (node.right != null) {
            stack.push(node.right);
        }
        if (node.left != null) {
            stack.push(node.left);
        }
    }
}
public static void inOrderTraversalStack(Node root) {
    Stack<Node> stack = new Stack<>();
    Node node = root;
    while (node != null || !stack.isEmpty()) {
        if (node != null) {
            stack.push(node);
            node = node.left;
        } else {
            node = stack.pop();
            System.out.print(node.value); //中序遍历
            node = node.right;
        }
    }
}
public static void postOrderTraversalStack(Node root) {
    Stack<Node> stack = new Stack<>();
    Stack<Node> output = new Stack<>();//构造一个中间栈来存储逆后序遍历的结果
    Node node = root;
    while (node != null || !stack.isEmpty()) {
        if (node != null) {
            output.push(node);
            stack.push(node);
            node = node.right;
        } else {
            node = stack.pop();
            node = node.left;
        }
    }
    while (!output.isEmpty()) {
        System.out.print(output.pop().value); //后序遍历
    }
}广度优先 Breadth First Search
又叫宽度优先搜索,或横向优先搜索。 
对每一层节点依次访问,访问完一层进入下一层,而且每个节点只能访问一次
public static void levelTraversal(Node root) {
    LinkedList<Node> queue = new LinkedList<>(); //LinkedList是Java中最普通的一个队列(Queue)实现
    queue.offer(root); //add、addLast
    while (!queue.isEmpty()) {
        Node node = queue.poll();//removeFirst
        System.out.print(node.value);
        if (node.left != null) {
            queue.offer(node.left);
        }
        if (node.right != null) {
            queue.offer(node.right);
        }
    }
}2018-12-8
二叉树 遍历 先序 中序 后序 深度 广度 MD的更多相关文章
- 【数据结构】二叉树的遍历(前、中、后序及层次遍历)及leetcode107题python实现
		文章目录 二叉树及遍历 二叉树概念 二叉树的遍历及python实现 二叉树的遍历 python实现 leetcode107题python实现 题目描述 python实现 二叉树及遍历 二叉树概念 二叉 ... 
- LeetCode:二叉树的前、中、后序遍历
		描述: ------------------------------------------------------- 前序遍历: Given a binary tree, return the pr ... 
- TZOJ 3209 后序遍历(已知中序前序求后序)
		描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义: ... 
- DS Tree 已知先序、中序 => 建树 => 求后序
		参考:二叉树--前序和中序得到后序 思路历程: 在最初敲的时候,经常会弄混preorder和midorder的元素位置.大体的思路就是在preorder中找到根节点(根节点在序列的左边),然后在mid ... 
- [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)
		Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ... 
- [Java]算术表达式求值之一(中序表达式转后序表达式方案)
		第二版请见:https://www.cnblogs.com/xiandedanteng/p/11451359.html 入口类,这个类的主要用途是粗筛用户输入的算术表达式: package com.h ... 
- 已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现
		public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ... 
- 前、中、后序遍历随意两种是否能确定一个二叉树?理由?  && 栈和队列的特点和区别
		前序和后序不能确定二叉树理由:前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树. 由二叉树的中序和前序遍历序列 ... 
- HDU 1710Binary Tree Traversals(已知前序中序,求后序的二叉树遍历)
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1710 解题思路:可以由先序和中序的性质得到 : 先序的第一个借点肯定是当前子树的根结点, 那么在 中序 ... 
随机推荐
- linux 驱动之LCD驱动(有framebuffer)
			<简介> LCD驱动里有个很重要的概念叫帧缓冲(framebuffer),它是Linux系统为显示设备提供的一个接口,应用程序在图形模式允许对显示缓冲区进行读写操作.用户根本不用关心物理显 ... 
- 使用Google-Colab训练PyTorch神经网络
			Colaboratory 是免费的 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行.关键是还有免费的GPU可以使用!用Colab训练PyTorch神经网络步骤如下: 1: ... 
- MyBatis中使用#{}和${}的区别
			select * from table_name where id=#{id}; select * from table_name where id=${id}; 区别: 在动态SQL解析阶段,#{} ... 
- Python生成requirements.txt包依赖管理文件
			requirements.txt是Python的依赖管理软件,和Java的POM一样. requirements.txt会生成使用了pip安装后的依赖包,在正常环境下会生成这个目录下的包/usr/lo ... 
- javascript区域打印代码
			这段代码是我从Highcharts的代码中改造出来的,非常感谢Highcharts的作者,先链上Highcharts的地址http://www.highcharts.com/,(Highcharts的 ... 
- DELPHI 常用虚拟键:VK_
			常数名称 十六进制值 十进制值 对应按键 VK_LBUTTON 01 ... 
- delphi  使用工控机控件 iThreadTimes 出现问题, 导致主程序创建页面的时候, 阻塞消息, 不能正常执行。
			delphi 使用工控机控件 iThreadTimes 出现问题, 导致主程序创建页面的时候, 阻塞消息, 不能正常执行. 使用这个控件需要小心 function Tfrm_MainIPC.Open ... 
- [Winform]CefSharp ——js调用c#方法
			摘要 有时我们在winform中嵌入浏览器,需要在页面上读取电脑上的一些信息,这个时候就需要用到CefSharp的RegisterJsObject进行注册方法然后供js进行调用了. 一个例子 我们在w ... 
- 用DELPHI 开发压缩、解压、自解压、加密
			引 言:在日常中,我们一定使用过WINZIP.WINRAR这样的出名的压缩软件,就是我们开发软件过程中不免要遇到数据加密.数据压缩的问题!本文中就这一技术问题展开探讨,同时感谢各位网友的技巧,在我每次 ... 
- mybatis学习之路----批量更新数据两种方法效率对比
			原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ... 
