JAVA递归、非递归遍历二叉树
前序遍历:
1.访问根节点
2.前序遍历左子树
3.前序遍历右子树
中序遍历:
1.中序遍历左子树
2.访问根节点
3.中序遍历右子树
后序遍历:
1.后序遍历左子树
2.后序遍历右子树
3.访问根节点
---------------------
package design; import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Stack; public class BinTree {
char data;
BinTree leftChild;
BinTree rightChild;
public BinTree(char c) {
data = c;
}
public static void preSearch(BinTree root){
if(root !=null){
System.out.print(root.data);
preSearch(root.leftChild);
preSearch(root.rightChild);
}
}
public static void midSearch(BinTree root){
if(root !=null){
midSearch(root.leftChild);
System.out.print(root.data);
midSearch(root.rightChild);
}else{
return;
}
}
public static void postSearch(BinTree root){
if(root !=null){
postSearch(root.leftChild);
postSearch(root.rightChild);
System.out.print(root.data);
}
}
// 先序遍历非递归
public static void preOrder(BinTree root){
Stack<BinTree> s = new Stack<BinTree>();
while(root !=null || !s.empty()){
while(root!=null){
System.out.print(root.data);
s.push(root);
root = root.leftChild;
}
if(!s.empty()){
root = s.pop();
root = root.rightChild;
}
}
}
// 中序遍历非递归
public static void midOrder(BinTree root){
Stack<BinTree> s = new Stack<BinTree>();
while(root!=null || !s.empty()){
while(root!=null){
s.push(root);
root = root.leftChild;
}
if(!s.empty()){
root =s.pop();
System.out.print(root.data);
root = root.rightChild;
}
}
}
// 后序遍历非递归
public static void postOrder(BinTree root){
Stack<BinTree> s = new Stack<BinTree>();
Stack<Integer> s2 = new Stack<Integer>();
Integer i = new Integer();
while(root!=null || !s.empty()){
while(root!=null){
s.push(root);
s2.push(new Integer());
root = root.leftChild;
}
while(!s.empty() && s2.peek().equals(i)){
s2.pop();
System.out.print(s.pop().data);
}
if(!s.empty()){
s2.pop();
s2.push(new Integer());
root =s.peek();
root = root.rightChild;
}
}
}
//计算二叉树的深度
public static int level(BinTree root){
if(root == null){
return ;
}
return level(root.leftChild)+>level(root.rightChild)+?level(root.leftChild)+:level(root.rightChild)+; }
//层序遍历二叉树
public static void levelTrav(BinTree root) {
if (root == null)
return;
Queue<BinTree> q = new ArrayDeque<BinTree>();
q.add(root);
BinTree cur;
while (!q.isEmpty()) {
cur = q.peek();
System.out.print(cur.data + " ");
if (cur.leftChild != null)
q.add(cur.leftChild);
if (cur.rightChild != null)
q.add(cur.rightChild);
q.poll();
}
}
public static void main(String[] args) {
BinTree b1 = new BinTree('a');
BinTree b2 = new BinTree('b');
BinTree b3 = new BinTree('c');
BinTree b4 = new BinTree('d');
BinTree b5 = new BinTree('e'); /**
* a
* / \
* b c
* / \
* d e
*/
b1.leftChild = b2;
b1.rightChild = b3;
b2.leftChild = b4;
b2.rightChild = b5; BinTree.preSearch(b1);
System.out.println();
BinTree.preOrder(b1);
System.out.println("========================");
BinTree.midSearch(b1);
System.out.println("");
BinTree.midOrder(b1);
System.out.println("========================");
BinTree.postSearch(b1);
System.out.println();
BinTree.postOrder(b1);
System.out.println("========================");
System.out.println(BinTree.level(b1));
System.out.println("========================");
BinTree.levelTrav(b1);
}
}
JAVA递归、非递归遍历二叉树的更多相关文章
- java创建二叉树并实现非递归中序遍历二叉树
java创建二叉树并递归遍历二叉树前面已有讲解:http://www.cnblogs.com/lixiaolun/p/4658659.html. 在此基础上添加了非递归中序遍历二叉树: 二叉树类的代码 ...
- 二叉树的先序、中序以及后序遍历(递归 && 非递归)
树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...
- 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)
一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...
- 最近公共祖先 LCA 递归非递归
给定一棵二叉树,找到两个节点的最近公共父节点(LCA).最近公共祖先是两个节点的公共的祖先节点且具有最大深度.假设给出的两个节点都在树中存在. dfs递归写法 查找两个node的最近公共祖先,分三种情 ...
- Reverse Linked List 递归非递归实现
单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...
- Java实现二叉树的创建、递归/非递归遍历
近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...
- 二叉树的递归,非递归遍历(java)
import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private ...
- 二叉树——遍历篇(递归/非递归,C++)
二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...
- 树的广度优先遍历和深度优先遍历(递归非递归、Java实现)
在编程生活中,我们总会遇见树性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程.现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的) 1.广度优先遍历 英文缩写为BFS即B ...
- 二叉树的递归,非递归遍历(C++)
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...
随机推荐
- Mybatis学习——Mybatis核心配置
MyBatis的核心配置 在使用MyBatis框架时,设计两个核心的d对象:SqlSessionFactory和SqlSession. SqlsessionFactory SqlSessionFact ...
- Mybatis配置文件无故报错、无自动完成提示的解决方法,及自动生成主要配置项
1.引子 Mybatis配置文件显示红叉有错误,而实际检查又没有错误,这是因为开发环境不能识别这种类型的xml文件.要解决这个问题,就要让IDE开发环境能够“认识”这个文件类型,我们要让IDE环境将这 ...
- nm命令介绍
一.参考文章 网址1:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/nm.html 参考2: man nm 参考3:<linux ...
- goweb- session和数据存储
session和数据存储 Web开发中一个很重要的议题就是如何做好用户的整个浏览过程的控制,因为HTTP协议是无状态的,所以用户的每一次请求都是无状态的,我们不知道在整个Web操作过程中哪些连接与该用 ...
- Hadoop_课堂笔记1
1.课程目标 实践性 2.课下需要 在家搭建一个伪分布式 3.大数据概念和意义 08年Nature第一次正式提出大数据概念 常规的数据库:结构化的数据库 TB级的结构化数据管理就很困难,需要分布式 当 ...
- $.post系统登录校验
AJAX方式:$.post系统登录校验 https://blog.csdn.net/woshisangsang/article/details/66560238?utm_source=blogxgwz ...
- Java之代码块
package com.atguigu.java3;/* * 代码块(或初始化块) * * 1. 代码块的作用:用来初始化类.对象 * 2. 代码块如果有修饰的话,只能使用static. * 3. 分 ...
- Graylog
Graylog #Graylog 是与 ELK 可以相提并论的一款集中式日志管理方案,支持数据收集.检索.可视化 #Graylog 架构 - Graylog 负责接收来自各种设备和应用的日志,并为用 ...
- 九、linux-msyql下的mysql主从复制深度实战
1.上节基本诉说了mysql主从同步,这里想说明的是,其一从库在请求主库进行同步的时候,是主库的主线程进行用户名.密码的验证,在验证通过后,将请求转交给I/O线程负责同步:其二从库sql线程在读取中继 ...
- [LC] 451. Sort Characters By Frequency
Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...