博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java实现二叉树先序,中序,后序遍历
阅读量:5295 次
发布时间:2019-06-14

本文共 5356 字,大约阅读时间需要 17 分钟。

以下是我要解析的一个二叉树的模型形状

 

接下来废话不多直接上代码

一种是用递归的方法,另一种是用堆栈的方法:

首先创建一棵树:

 

节点对象:

 

 

1 public class Node { 2   //节点数值 3   private int data; 4   //左子节点 5   private Node leftNode; 6   //右子节点 7   private Node rightNode; 8  9   public Node(int data, Node leftNode, Node rightNode) {10     this.data = data;11     this.leftNode = leftNode;12     this.rightNode = rightNode;13   }14 15   public int getData() {16     return data;17   }18 19   public void setData(int data) {20     this.data = data;21   }22 23   public Node getLeftNode() {24     return leftNode;25   }26 27   public void setLeftNode(Node leftNode) {28     this.leftNode = leftNode;29   }30 31   public Node getRightNode() {32     return rightNode;33   }34 35   public void setRightNode(Node rightNode) {36     this.rightNode = rightNode;37   }38 }

 

 

 

 

递归方式,实现树的遍历:

1 public class BinaryTreeWithNode1 { 2  3   /** 4    * 二叉树的先序中序后序排序 5    */ 6   public Node init() {
//注意必须逆序建立,先建立子节点,再逆序往上建立,因为非叶子结点会使用到下面的节点,而初始化是按顺序初始化的,不逆序建立会报错 7 Node J = new Node(8, null, null); 8 Node H = new Node(4, null, null); 9 Node G = new Node(2, null, null);10 Node F = new Node(7, null, J);11 Node E = new Node(5, H, null);12 Node D = new Node(1, null, G);13 Node C = new Node(9, F, null);14 Node B = new Node(3, D, E);15 Node A = new Node(6, B, C);16 return A; //返回根节点17 }18 19 public void printNode(Node node) {20 System.out.print(node.getData());21 }22 23 public void theFirstTraversal(Node root) { //先序遍历24 printNode(root);25 if (root.getLeftNode() != null) { //使用递归进行遍历左孩子26 theFirstTraversal(root.getLeftNode());27 }28 if (root.getRightNode() != null) { //递归遍历右孩子29 theFirstTraversal(root.getRightNode());30 }31 }32 33 public void theInOrderTraversal(Node root) { //中序遍历34 if (root.getLeftNode() != null) {35 theInOrderTraversal(root.getLeftNode());36 }37 printNode(root);38 if (root.getRightNode() != null) {39 theInOrderTraversal(root.getRightNode());40 }41 }42 43 44 public void thePostOrderTraversal(Node root) { //后序遍历45 if (root.getLeftNode() != null) {46 thePostOrderTraversal(root.getLeftNode());47 }48 if (root.getRightNode() != null) {49 thePostOrderTraversal(root.getRightNode());50 }51 printNode(root);52 }53 54 public static void main(String[] args) {55 BinaryTreeWithNode1 tree = new BinaryTreeWithNode1();56 Node root = tree.init();57 System.out.println("先序遍历");58 tree.theFirstTraversal(root);59 System.out.println("");60 System.out.println("中序遍历");61 tree.theInOrderTraversal(root);62 System.out.println("");63 System.out.println("后序遍历");64 tree.thePostOrderTraversal(root);65 System.out.println("");66 }67 68 }

 

堆栈方式,实现树的遍历:

 

1 import java.util.Stack; 2  3  4 public class BinaryTreeWithNode2 { 5  6  7   public Node init() {
//注意必须逆序建立,先建立子节点,再逆序往上建立,因为非叶子结点会使用到下面的节点,而初始化是按顺序初始化的,不逆序建立会报错 8 Node J = new Node(8, null, null); 9 Node H = new Node(4, null, null);10 Node G = new Node(2, null, null);11 Node F = new Node(7, null, J);12 Node E = new Node(5, H, null);13 Node D = new Node(1, null, G);14 Node C = new Node(9, F, null);15 Node B = new Node(3, D, E);16 Node A = new Node(6, B, C);17 return A; //返回根节点18 }19 20 public void printNode(Node node) {21 System.out.print(node.getData());22 }23 24 25 public void theFirstTraversal_Stack(Node root) { //先序遍历26 Stack
stack = new Stack
();27 Node node = root;28 while (node != null || stack.size() > 0) { //将所有左孩子压栈29 if (node != null) { //压栈之前先访问30 printNode(node);31 stack.push(node);32 node = node.getLeftNode();33 } else {34 node = stack.pop();35 node = node.getRightNode();36 }37 }38 }39 40 public void theInOrderTraversal_Stack(Node root) { //中序遍历41 Stack
stack = new Stack
();42 Node node = root;43 while (node != null || stack.size() > 0) {44 if (node != null) {45 stack.push(node); //直接压栈46 node = node.getLeftNode();47 } else {48 node = stack.pop(); //出栈并访问49 printNode(node);50 node = node.getRightNode();51 }52 }53 }54 55 public void thePostOrderTraversal_Stack(Node root) { //后序遍历56 Stack
stack = new Stack
();57 Stack
output = new Stack
();//构造一个中间栈来存储逆后序遍历的结果58 Node node = root;59 while (node != null || stack.size() > 0) {60 if (node != null) {61 output.push(node);62 stack.push(node);63 node = node.getRightNode();64 } else {65 node = stack.pop();66 node = node.getLeftNode();67 }68 }69 System.out.println(output.size());70 while (output.size() > 0) {71 72 printNode(output.pop());73 }74 }75 76 public static void main(String[] args) {77 BinaryTreeWithNode2 tree = new BinaryTreeWithNode2();78 Node root = tree.init();79 System.out.println("先序遍历");80 tree.theFirstTraversal_Stack(root);81 System.out.println("");82 System.out.println("中序遍历");83 tree.theInOrderTraversal_Stack(root);84 System.out.println("");85 System.out.println("后序遍历");86 tree.thePostOrderTraversal_Stack(root);87 System.out.println("");88 }89 90 91 }

 

原文出处:

 

转载于:https://www.cnblogs.com/betterboyz/p/9205118.html

你可能感兴趣的文章
ASIHTTPRequest框架官方文档
查看>>
qt,ui,QUiLoader
查看>>
494 - Kindergarten Counting Game
查看>>
Android 字体效果
查看>>
HDU 2103 Family Plan
查看>>
3.6.2投影峰谷查找
查看>>
小程序教程相关链接
查看>>
JFreeChart
查看>>
net3.5 无网络环境安装
查看>>
ARDUINO W5100 WebServer测试
查看>>
作业2
查看>>
mysql分页存储过程
查看>>
一致性hash和solr千万级数据分布式搜索引擎中的应用
查看>>
java之maven之maven的使用
查看>>
HNOI2007 分裂游戏
查看>>
推荐几个不错的 java 教程和 HTML 教程
查看>>
PWM
查看>>
OC的基础语法(三)
查看>>
NPOI生成EXCEL
查看>>
hdu 4312 Meeting point-2(4级)
查看>>