二叉树 遍历 先序 中序 后序 深度 广度 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 解题思路:可以由先序和中序的性质得到 : 先序的第一个借点肯定是当前子树的根结点, 那么在 中序 ...
 
随机推荐
- jquery获取系统当前时间
			
//判断是否在前面加0function getNow(s) { return s < 10 ? '0' + s: s;} var myDate = new Date(); var year=my ...
 - BZOJ4277 : [ONTAK2015]Cięcie
			
假设分成如下三段: [1..i][i+1..j][j+1..n] 考虑中间那一段,设f[i]为前i位组成的数模q的值,pow[i]为$10^i$模q的值,那么有: f[j]-f[i]*pow[j-i] ...
 - bzoj 1455 可并堆+并查集
			
一个堆和一个并查集对应,并且满足并查集中所有没有死的人等于堆中的人 /************************************************************** Pr ...
 - nginx php-fpm安装配置(转)
			
nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端. nginx一般是把请求发fastcgi管理进程处理,fascgi管 ...
 - InnoDB 与 MYISAM
			
http://www.cnblogs.com/sopc-mc/archive/2011/11/01/2232212.html
 - CSS高速制作图片轮播的焦点
			
来源:http://www.ido321.com/858.html 效果图: 演示地址:http://jsfiddle.net/Web_Code/q5qfd8aL/embedded/result/ 代 ...
 - Unity3D实践系列06,球体撞击物体游戏
			
本篇实现一个球体在固定区域移动撞击Cube的游戏. 首先有1个Plane当作地面,1个Sphere当作球体,4个Cube当作墙,12个Cube当作被撞击物体,另外还有球体的撞击计算,在撞击的过程适时显 ...
 - 更好使用jQuery的8个小技巧
			
更好地使用jQuery,这里总结了8个小技巧. 1.DOM遍历是昂贵的,将变量缓存起来. //不推荐var h = $('#ele').height();$('#ele').css('height', ...
 - IOS开发中的CGFloat、CGPoint、CGSize和CGRect
			
IOS开发中的CGFloat.CGPoint.CGSize和CGRect http://developer.apple.com/library/ios/#documentation/GraphicsI ...
 - smartsvn学习(一)Xcode下svn客户端使用指南
			
http://smartsvn.com/features 说明 场景 执行步骤 创建新项目 一,二,三,四 下载项目 一,二,四 代码提交 五 代码更新 六 一,打开SCM 在xcode中,点击菜单: ...