Java实现树的遍历以及打印(递归,非递归)
import java.util.LinkedList;
import java.util.Stack; public class BinarySearchTree1<E extends Comparable <? super E>>{ private static class BinaryNode<E> { E element;
BinaryNode<E> left;
BinaryNode<E> right; BinaryNode(E theElement) {
this(theElement, null, null);
} BinaryNode(E theElement, BinaryNode<E> lt, BinaryNode<E> rt) {
element = theElement;
left = lt;
right = rt;
} } private BinaryNode<E>root;
public void insert(E x){
root = insert(x,root);
} private BinaryNode<E> insert(E x, BinaryNode<E> t){ if (t == null){
return new BinaryNode<>(x,null,null);
}
int compareResult = x.compareTo(t.element);
if (compareResult < 0){
t.left = insert(x,t.left);
}else if (compareResult > 0){
t.right = insert(x,t.right);
}else {
;
}
return t; } // 前序遍历递归
public void PreOrder(BinaryNode<E> Node){
if (Node != null){
System.out.print(Node.element + " ");
PreOrder(Node.left);
PreOrder(Node.right);
}
}
// 前序遍历非递归
public void preOrder(BinaryNode<E> Node){
if (Node == null){
return;
}
Stack<BinaryNode<E>> s = new Stack<>();
while (Node != null || !s.empty()) {
if (Node != null) {
System.out.print(Node.element + " ");
s.push(Node);
Node = Node.left;
} else {
Node = s.pop();
Node = Node.right;
}
}
}
// 中序遍历递归
public void MidOrder(BinaryNode<E> Node){
if (Node != null){
MidOrder(Node.left);
System.out.print(Node.element + " ");
MidOrder(Node.right);
}
}
// 中序遍历非递归
public void midOrder(BinaryNode<E> Node){
if (Node == null){
return;
}
Stack<BinaryNode<E>> s = new Stack<>();
while (Node != null || !s.empty()){
if (Node != null) {
s.push(Node);
Node = Node.left;
}else {
Node = s.pop();
System.out.print(Node.element + " ");
Node = Node.right;
}
}
}
// 后序遍历递归
public void PosOrder(BinaryNode<E> Node){
if (Node != null){
PosOrder(Node.left);
PosOrder(Node.right);
System.out.print(Node.element + " ");
}
}
// 后序遍历非递归
public void posOrder(BinaryNode<E> Node){
if (Node == null){
return;
}
Stack<BinaryNode<E>> s = new Stack<>();
BinaryNode<E> NowNode;
BinaryNode<E> BefNode;
NowNode = Node;
BefNode = Node;
//把NowNode移到左子树下边
while (NowNode != null){
s.push(NowNode);
NowNode = NowNode.left;
}
while (s != null){
NowNode = s.pop();
//无右子树或右子树已被访问
if (NowNode.right != null && NowNode.right != BefNode){
s.push(NowNode);
NowNode = NowNode.left;
if (NowNode != null){
s.push(NowNode);
NowNode = NowNode.left;
}
}else {
System.out.print(NowNode.element + " ");
BefNode = NowNode;
}
}
}
// 层序遍历队列
public void levelOrder(BinaryNode<E> Node){
LinkedList<BinaryNode<E>> list = new LinkedList<>();
list.add(Node);
while (!list.isEmpty()){
Node = list.poll();
System.out.print(Node.element + " ");
if (Node.left != null){
list.offer(Node.left);
}
if (Node.right != null){
list.offer(Node.right);
}
} } // 树的深度
public int Depth(BinaryNode<E> Node){ if (Node == null){
return 0;
}
int l = Depth(Node.left);
int r = Depth(Node.right);
if (l > r){
return l+1;
}else {
return r+1;
} } // 桉树状打印二叉树
public void PrintTree(BinaryNode<E> Node,int high){
if (Node == null){
return;
}
PrintTree(Node.right,high+1);
for (int i = 0 ; i < high ; i++) {
System.out.print(" ");
}
System.out.println(Node.element + " ");
PrintTree(Node.left,high+1);
} public static void main(String[] args) {
int [] input = {4,2,6,1,3,5,7,8,10};
BinarySearchTree1<Integer> tree = new BinarySearchTree1<>();
for (int i = 0 ; i < input.length ; i++){
tree.insert(input[i]);
}
System.out.print("递归前序遍历: ");
tree.PreOrder(tree.root);
System.out.println();
System.out.print("非递归前序遍历:");
tree.preOrder(tree.root);
System.out.println();
System.out.print("递归中序遍历: ");
tree.MidOrder(tree.root);
System.out.println();
System.out.print("非递归中序遍历:");
tree.midOrder(tree.root);
System.out.println();
System.out.print("递归后序遍历: ");
tree.PosOrder(tree.root);
System.out.println();
// System.out.print("非递归后序遍历:");
// tree.posOrder(tree.root);
// System.out.println();
System.out.print("队列层序遍历: ");
tree.levelOrder(tree.root);
System.out.println();
tree.PrintTree(tree.root,tree.Depth(tree.root));
} }
Java实现树的遍历以及打印(递归,非递归)的更多相关文章
- Reverse Linked List 递归非递归实现
单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...
- 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)
一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...
- 树的广度优先遍历和深度优先遍历(递归非递归、Java实现)
在编程生活中,我们总会遇见树性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程.现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的) 1.广度优先遍历 英文缩写为BFS即B ...
- Java实现二叉树的创建、递归/非递归遍历
近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...
- 二叉树的递归,非递归遍历(java)
import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private ...
- 二叉树总结—建树和4种遍历方式(递归&&非递归)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...
- 二叉树的先序、中序以及后序遍历(递归 && 非递归)
树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...
- 二叉树的递归,非递归遍历(C++)
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...
- 递归/非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)
递归代码:递归实现很简单 '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...
随机推荐
- CCF认证 201903-4消息传递接口
题目 代码 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <stri ...
- dubbo源码分析- 集群容错之Cluster(一)
1.集群容错的配置项 failover - 失败自动切换,当出现失败,重试其他服务器(缺省),通常用于读操作,但重试会带来更长的延时. failfast - 快速失效,只发起一次调用,失败立即报错.通 ...
- shell (7)if 表达式
文件表达式if [ -f file ] 如果文件存在if [ -d … ] 如果目录存在if [ -s file ] 如果文件存在且非空if [ -r file ] 如果文件存在且可读if [ -w ...
- HTML+CSS编写五环居中案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 1093 - You can't specify target table 'account' for update in FROM clause
目的:查询一张表的相同的两条数据,并删除一条数据. 分析 先查询出相同的数据,然后删除 查询相同的数据 SELECT a.id FROM account a GROUP BY a.username H ...
- Spring+SpringMVC+Spring Data JPA完美整合
使用Maven实现SSS框架的整合. 方便记录,专门建了一个pom项目用来整合SSS框架所用的jar包 1.POM项目,作为父级项目,记录整个整合中的依赖jar包pom文件 <project x ...
- Flink Table Api & SQL 翻译目录
Flink 官网 Table Api & SQL 相关文档的翻译终于完成,这里整理一个安装官网目录顺序一样的目录 [翻译]Flink Table Api & SQL —— Overv ...
- 大数据 -- kafka学习笔记:知识点整理(部分转载)
一 为什么需要消息系统 1.解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多 ...
- javascript下載csv檔案
參考自: https://dotblogs.com.tw/shihgogo/2017/05/31/090831 function createCsvFile(){ var fileName = &qu ...
- 【MongoDB学习之三】条件操作符
环境 MongoDB 4.0 CentOS6.5_x64 一.条件操作符 (>) 大于 - $gt (<) 小于 - $lt (>=) 大于等于 - $gte (<= ) 小于 ...