java实现二叉树遍历的三种方式

作者:zhangbinu 时间:2021-12-03 06:11:51 

本文实例为大家分享了java实现二叉树遍历的具体代码,供大家参考,具体内容如下

二叉树如下:

java实现二叉树遍历的三种方式

遍历结果如下:

java实现二叉树遍历的三种方式

以下是实现代码:


package binTree;

import java.util.Stack;

/**
* @author bin.zhang
* @version 2017年8月29日 上午10:22:01
*/
public class BinTreeTraversal {
public static void main(String[] args) {
 System.out.print("前序:");
 Traversal.preOrder();
 Traversal.preOrderRecursion(Traversal.createBinTree());
 System.out.print("中序:");
 Traversal.inOrder();
 Traversal.inOrderRecursion(Traversal.createBinTree());
 System.out.print("后序:");
 Traversal.postOrder();
 Traversal.postOrderRecursion(Traversal.createBinTree());
}
}

/**
* 节点数据结构
*
* @author bin.zhang
* @version 2017年8月30日 上午11:49:38
*/
class BinTreeNode {

BinTreeNode() {
}

BinTreeNode(char data, int flag, BinTreeNode lchild, BinTreeNode rchild) {
 this.data = data;
 this.flag = flag;
 this.lchild = lchild;
 this.rchild = rchild;
}

char data;
int flag;
BinTreeNode lchild, rchild;

}

class Traversal {

/**
 * 创建一棵二叉树
 *
 * @author bin.zhang
 * @return 根节点
 */
public static BinTreeNode createBinTree() {
 BinTreeNode R3 = new BinTreeNode('F', 0, null, null);
 BinTreeNode L2 = new BinTreeNode('D', 0, null, null);
 BinTreeNode R2 = new BinTreeNode('E', 0, null, R3);
 BinTreeNode L1 = new BinTreeNode('B', 0, L2, R2);
 BinTreeNode R1 = new BinTreeNode('C', 0, null, null);
 BinTreeNode T = new BinTreeNode('A', 0, L1, R1);
 return T;
}

// 前序
public static void preOrder() {

BinTreeNode p = createBinTree();

Stack<BinTreeNode> stack = new Stack<BinTreeNode>();

while (p != null || !stack.empty()) {
  if (p != null) {
   System.out.print(p.data);
   stack.push(p);
   p = p.lchild;
  }
  else {
   p = stack.pop();
   p = p.rchild;
  }
 }
 System.out.println();

}

// 前序递归
public static void preOrderRecursion(BinTreeNode top) {
 if (top != null) {
  System.out.println(top.data);
  preOrderRecursion(top.lchild);
  preOrderRecursion(top.rchild);
 }
}

// 中序
public static void inOrder() {

BinTreeNode p = createBinTree();

Stack<BinTreeNode> stack = new Stack<BinTreeNode>();

while (p != null || !stack.empty()) {
  if (p != null) {
   stack.push(p);
   p = p.lchild;
  }
  else {
   p = stack.pop();
   System.out.print(p.data);
   p = p.rchild;
  }
 }
 System.out.println();
}

// 中序递归
public static void inOrderRecursion(BinTreeNode top) {
 if (top != null) {
  inOrderRecursion(top.lchild);
  System.out.println(top.data);
  inOrderRecursion(top.rchild);
 }
}

// 后序
public static void postOrder() {

BinTreeNode p = createBinTree();

Stack<BinTreeNode> stack = new Stack<BinTreeNode>(); // 初始化栈

int mark = 1; // 转向标志
 while (p != null || !stack.empty()) { // 遍历
  if (p != null && mark != 0) {
   stack.push(p);
   p = p.lchild;
  }// 转向左子树
  else {
   p = stack.pop();
   p.flag++; // 退栈
   if (p.flag == 1) {
    stack.push(p);
    p = p.rchild;
    mark = 1;
   } // 转向右子树
   else if (p.flag == 2 && !stack.empty()) { // 输出结点
    System.out.print(p.data);
    mark = 0;
   }
   else if (p.flag == 2 && stack.empty()) { // 输出根结点并退出
    System.out.print(p.data);
    break;
   }
  } // if-else
 } // while
 System.out.println();
}

// 后序递归
public static void postOrderRecursion(BinTreeNode top) {
 if (top != null) {
  postOrderRecursion(top.lchild);
  postOrderRecursion(top.rchild);
  System.out.println(top.data);
 }
}
}

来源:https://blog.csdn.net/zhangbinu/article/details/77679901

标签:java,二叉树,遍历
0
投稿

猜你喜欢

  • Android中使用GridView进行应用程序UI布局的教程

    2022-03-19 15:18:06
  • Android 沉浸式状态栏及悬浮效果

    2023-07-29 23:03:15
  • SpringBoot+JWT实现注册、登录、状态续签流程分析

    2022-09-29 09:07:11
  • 详解Mybatis-plus中更新date类型数据遇到的坑

    2022-08-17 21:43:14
  • c#测试反射性能示例

    2021-12-19 23:13:47
  • Java获取中文拼音、中文首字母缩写和中文首字母的示例

    2021-07-18 14:28:16
  • jbuilder2006连接sqlserver2000的方法

    2022-08-21 14:20:09
  • Java使用HttpUtils实现发送HTTP请求

    2021-06-11 07:08:39
  • C#实现加密与解密详解

    2023-08-11 16:54:42
  • Java多线程锁机制相关原理实例解析

    2023-05-25 12:33:37
  • Java多个版本切换的几种方法

    2022-04-22 14:10:15
  • 基于Spring depends-on的使用详解

    2021-09-29 16:23:20
  • Android自定义水平渐变进度条

    2022-06-02 14:22:42
  • Java 普通代码块静态代码块执行顺序(实例讲解)

    2022-07-11 05:44:28
  • 在Java内存模型中测试并发程序代码

    2023-11-24 20:37:55
  • java实现上传图片并压缩图片大小功能

    2023-06-14 22:32:35
  • Spring Junit单元测试加载配置文件失败问题

    2022-06-05 13:37:48
  • Java8通过CompletableFuture实现异步回调

    2022-07-31 01:43:53
  • Android编程常用技巧实例总结

    2022-11-30 20:27:44
  • 2020最新 idea下载、安装与创建项目测试的教程图解

    2023-10-22 08:08:14
  • asp之家 软件编程 m.aspxhome.com