Java实现二叉树先序,中序,后序遍历

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

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

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

首先创建一棵树:

节点对象:

 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<Node> stack = new Stack<Node>();
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<Node> stack = new Stack<Node>();
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<Node> stack = new Stack<Node>();
57     Stack<Node> output = new Stack<Node>();//构造一个中间栈来存储逆后序遍历的结果
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 }

原文出处:Java实现二叉树先序,中序,后序遍历

原文地址:https://www.cnblogs.com/betterboyz/p/9205118.html

时间: 2024-11-12 00:17:00

Java实现二叉树先序,中序,后序遍历的相关文章

分别求二叉树前、中、后序的第k个节点

一.求二叉树的前序遍历中的第k个节点 //求先序遍历中的第k个节点的值 int n=1; elemType preNode(BTNode *root,int k){ if(root==NULL) return ' '; if(n==k) return root->data; n++; elemType ch = preNode(root->lchild,k); if(ch!=' ') return ch; ch = preNode(root->rchild,k); return ch;

通过二叉树的中序序列和后序序列获取前序序列

二叉树的遍历方式常见的三种是:先序遍历(ABC).中序遍历(BAC).后序遍历(BCA) 先序遍历: 若二叉树为空,则空操作:否则: 访问根结点; 先序遍历左子树: 先序遍历右子树. 中序遍历: 若二叉树为空,则空操作:否则: 中序遍历左子树: 访问根结点: 中序遍历右子树. 后序遍历: 若二叉树为空,则空操作:否则: 后序遍历左子树: 后序遍历右子树: 访问根结点. 在学习到 根据遍历序列确定二叉树 时,知道了:可以通过二叉树的先中或者中后遍历序列唯一确定一棵二叉树. 根据算法描述 使用jav

算法进化历程之“根据二叉树的先序和中序序列输出后序序列”

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 前不久在看到一个作业"根据二叉树的先序和中序序列输出后序序列",当时我参考<数据结构与算法(C语言)习题集>上的做法,先根据先中序序列确定一颗二叉树,然后后序遍历二叉树输出后序序列. 函数采用了递归算法,利用函数传入的先序和中序序列的左右边界,确定要处理的序列段,生成相应的二叉树. 基本思路是,把该段先序序列的第一个元素作为当前二叉树的根结点,然后在中序序列找到根结点.根结点

先序序列和后序序列并不能唯一确定二叉树

数据结构的基础知识中重要的一点就是能否根据两种不同遍历序列的组合(有三种:先序+中序,先序+后序,中序+后序),唯一的确定一棵二叉树.然后就是根据二叉树的不同遍历序列(先序.中序.后序),重构二叉树.显然,这三种组合并不是都能唯一确定二叉树的,其中先序+后序就不能唯一确定一棵二叉树,其他两种组合可以唯一的确定一颗二叉树. 由先序序列和后序序列不能唯一确定一棵二叉树,因无法确定左右子树两部分. 反例:任何结点只有左子树的二叉树和任何结点只有右子树的二叉树,其前序序列相同,后序序列相同,但却是两棵不

中序表达式转后序表式式

中序表达式转后序表式式: 将中序表达式所有括号补全,然后将所有运算符向右移出无匹配的第一个右括号,去掉括号即为后序表式式 举例: 原式:a+b*(c+d/e) 补全括号:(a+(b*(c+(d/e)))) 操作符右移:(a(b(c(de)/)+)*)+ 去掉括号:abcde/+*+ 中序表达式转前序表式式: 将中序表达式所有括号补全,然后将所有运算符向左移出无匹配的第一个左括号,去掉括号即为前序表式式 举例: 原式:a+b*(c+d/e) 补全括号:(a+(b*(c+(d/e)))) 操作符右移

hdu1710-Binary Tree Traversals (由二叉树的先序序列和中序序列求后序序列)

http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4210    Accepted Submission(s): 1908 Problem Description A binary tree is a

java 根据二叉树前序 ,中序求后续

在一棵二叉树总,前序遍历结果为:ABDGCEFH,中序遍历结果为:DGBAECHF,求后序遍历结果. 我们知道: 前序遍历方式为:根节点->左子树->右子树 中序遍历方式为:左子树->根节点->右子树 后序遍历方式为:左子树->右子树->根节点 从这里可以看出,前序遍历的第一个值就是根节点,然后再中序遍历中找到这个值,那么这个值的左边部分即为当前二叉树的左子树部分前序遍历结果,这个值的右边部分即为当前二叉树的右子树部分前序遍历结果.因此,通过这个分析,可以恢复这棵二叉树

日常学习随笔-用链表的形式实现普通二叉树的新增、查找、遍历(前、中、后序)等基础功能(侧重源码+说明)

一.二叉树 1.二叉树的概念 二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree),其次序不能任意颠倒. 2.性质 (1)若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个结点(i>=0): (2)高度为k的二叉树最多有2^(k+1) - 1个结点(k>=-1). (空树的高度为-1): (3)对任何一棵二叉树,如果其叶子结点(度为0)数为m, 度为2的结点数为n,

二叉树遍历算法——包含递归前、中、后序和层次,非递归前、中、后序和层次遍历共八种

首先,要感谢网上的参考资料. http://mengliao.blog.51cto.com/876134/1178079(作者:BlackAlpha) http://blog.csdn.net/fzh1900/article/details/14056735(作者:_云淡风轻) http://blog.csdn.net/stpeace/article/details/8138458(作者:stpeace) 二叉树是使用的比较广泛的一种数据结构,这里我写了二叉树的相关操作,包括初始化.新建.以及遍

【数据结构】二叉树(前、中、后)序遍历的递归与非递归算法

对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁.而对 于树的遍历若采用非递归的方法,就要采用栈去模拟实现.在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一 点. 二叉树前序:访问根节点->左子树->右子树 (1)递归写法: 依次访问根节点.左子树.右子树,注意递归出口的结束. void _PrevOrder(Node* root)     {         i