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实现树的遍历以及打印(递归,非递归)的更多相关文章

  1. Reverse Linked List 递归非递归实现

    单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...

  2. 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)

    一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...

  3. 树的广度优先遍历和深度优先遍历(递归非递归、Java实现)

    在编程生活中,我们总会遇见树性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程.现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的) 1.广度优先遍历 英文缩写为BFS即B ...

  4. Java实现二叉树的创建、递归/非递归遍历

    近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...

  5. 二叉树的递归,非递归遍历(java)

    import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private ...

  6. 二叉树总结—建树和4种遍历方式(递归&&非递归)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...

  7. 二叉树的先序、中序以及后序遍历(递归 && 非递归)

    树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...

  8. 二叉树的递归,非递归遍历(C++)

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

  9. 递归/非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)

    递归代码:递归实现很简单 '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...

随机推荐

  1. ppt使用记录之添加带圈的20以内的数字编号

  2. python gaussian,gaussian2

    import numpy as np import matplotlib.pyplot as plt import mpl_toolkits.axisartist as axisartist from ...

  3. ubuntu17.10 源

    1.保险做法先备份源文件:  cp -i /etc/apt/sources.list /etc/apt/sources.list_backup 2.打开sources.list:   sudo ged ...

  4. 字符串反转(java和js)

    写在前面 关于字符串反转的奇技淫巧很多, 会一种就行了, 但是解锁更多姿势可谓艺多不压身啊~~ 正文 java https://www.cnblogs.com/binye-typing/p/92609 ...

  5. vue自定义指令导致的内存泄漏问题解决

    vue的自定义指令是一个比较容易引起内存泄漏的地方,原因就在于指令通常给元素绑定了事件,但是如果忘记了解绑,就会产生内存泄漏的问题. 看下面代码: directives: { scroll: { in ...

  6. XML 中 5 个预定义的实体引用

    < < 小于 > > 大于 & & 和号 &apos; ' 省略号 " " 引号

  7. ES6----拓展运算符 三个点【...】

    [...]拓展运算符是什么? es6中引入扩展运算符(...),它用于把一个数组转化为用逗号分隔的参数序列,它常用在不定参数个数时的函数调用,数组合并等情形.因为typeScript是es6的超集,所 ...

  8. Jav面向对象

    /* * 面向对象: * 1.关注现实存在的事物的各方面信息,从对象的角度出发,根据事物的特征进行程序设计 * 2.对象:用来描述客观事物的一个实体 * 3.类:具有相同属性和方法的一组对象的集合 * ...

  9. Ant Design Pro 子界面传值

  10. 抓包 抓nodejs的包 抓浏览器的包 抓手机的包

    应用场景: 确认接口是能用的,但自己使用时就是不行,参数有没有传正确?格式对不对?傻傻分不清. 抓包工具:这里演示 charles , 常用的还有 Fiddler, HttpWatch, WireSh ...