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 ...
随机推荐
- ubuntu之路——day19.1 深度CNN的探究
1.经典的CNN LeNet-5 1998的CNN鼻祖 以前用的sigmoid和tanh 下图给的是relu和softmax AlexNet ImageNet2012的冠军 VGG-16 ImageN ...
- SpringBoot(3)自定义Filter
SpringBoot自动添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,当然我们可以自定 义Filter. 自定义Filter需要两个 ...
- 如何查看电脑的GPU信息
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_33690342/article/ ...
- 《微信小程序商城开发实战》笔者的新书,欢迎各位粉丝上京东购买
作者图书京东链接,请点击------>>> **微信小程序商城开发实战** 附京东真实评价截图: 编辑推荐 在当今移动互联网大潮中,微信应用凭借其庞大的用户基数和极强的用户黏性 ...
- 基于cesium的GIS洪水淹没三维模拟系统
简介: “FloodFreeth3D”是一款对Mike11软件计算的洪水演进结果使用cesium进行淹没演进三维模拟的软件产品. 技术参数: 1. B/S架构,支持多Web浏览器(ie.chrom ...
- ROLLUP、CUBE、GROUP BY的使用区别
1.ROLLUP:根据维度在数据结果集中进行的聚合操作,可多维度SELECT count(*) num,MONTH(register_time) times,`status` FROM `user` ...
- SSL证书原理讲解
一直以来都对数字证书的签发,以及信任等事情一知半解.总算有个闲适的周末来总结和深入一下相关的知识. CA: CA(Certificate Authority)是证书的签发机构,它是负责管理和签发证书的 ...
- java只允许输入数字字母下划线中文
public static void main(String[] args) { Pattern pattern = Pattern.compile("[_0-9a-z]+"); ...
- Android NDK编译选项设置
Android NDK编译选项设置 网易加固关注 0.5472016.08.22 14:07:00字数 3,034阅读 6,805 在Android NDK开发中,有两个重要的文件:Android.m ...
- 品优购商城项目(六)CAS客户端与SpringSecurity集成
cas单点登录旨在解决传统登录模式session在分布式项目中共享登录信息的问题. 本文cas服务器使用 4.0版本,仅供学习参考.把 cas.war 直接部署在tomcat即可,这里有个固定的用户名 ...