二叉树 遍历 先序 中序 后序 深度 广度 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 解题思路:可以由先序和中序的性质得到 : 先序的第一个借点肯定是当前子树的根结点, 那么在 中序 ...
随机推荐
- 7.30 正睿暑期集训营 A班训练赛
目录 2018.7.30 正睿暑期集训营 A班训练赛 T1 A.蔡老板分果子(Hash) T2 B.蔡老板送外卖(并查集 最小生成树) T3 C.蔡老板学数学(DP NTT) 考试代码 T2 T3 2 ...
- .net core程序部署
前期将一些程序切换到了.net core,本文这里记录下windows 下.net core程序部署相关的方法.有同样需求的朋友可以参考一下,以免少走一些弯路. .net core程序部署主要工作就是 ...
- IAR EWARM __iar_program_start, __iar_data_init3, __iar_copy_init3, __iar_zero_init3
#include <stdint.h> // The type of a pointer into the init table. typedef void const * table_p ...
- Jquery中使用定时器setInterval和setTimeout
直接在ready中调用其他方法,会提示缺少对象的错误,解决方法如下: 方法1. 函数不在$(function(){....})内,setInterval第一个参数为"showAtuto&qu ...
- JBPM使用方法、过程记录
一.How to call Web Service Using JBPM 5, designer https://204.12.228.236/browse.php?u=ObFK10b3HDFCQUN ...
- 在Visual Studio中开发一个C语言程序
→新建一个项目→选择"其他语言","Visual C++",并选择"win32控制台应用程序",并给控制台应用程序起名.→点击"下 ...
- C#把数组中的某个元素取出来放到第一个位置
如何取出数组中符合某种条件的元素,然后放在数组最前面,即索引为0的位置? 思路大致如下:→找到符合条件的数组元素,把之赋值给一个临时变量temp,并记下该数组元素的索引位置,假设是index→在源数组 ...
- 连接ORACLE数据库,是不是必须要安装oracle客户端的运行时
大神给的回答: net连接oracle使用的是oci接口,必须安装oracle客户端,并配置本地网络服务名 tnsnames.ora.不过oracle网站有精简版的客户端软件,不到30M吧,解压,并编 ...
- 使用断言NSAssert()调试程序错误
NSAssert()只是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属于Bug,满足条件返回真值,程序继续运行,如果返回假值,则抛出异常,并切可以自定义异 ...
- eclipse 安装 weblogic server