引入
学习二叉树离不开访问遍历它,最简单的方法是递归遍历来实现,递归实现简单,但递推偏复杂些。
以下的递推代码是从MOOC上浙江大学的数据结构学习的,可以点开链接系统学习 数据结构-浙江大学 不过它是用C++写的,我这用Java简单实现下并加上些注释希望能帮助到一些人更容易理解。
Java代码
DisPlayBinaryTree.java
import java
.util
.LinkedList
;
import java
.util
.Queue
;
import java
.util
.Stack
;
public class DisPlayBinaryTree {
public void preorder(TreeNode curnode
){
Stack
<TreeNode> stack
= new Stack<>();
while(curnode
!= null
|| !stack
.isEmpty()){
while(curnode
!= null
){
System
.out
.print(curnode
.val
+" ");
stack
.push(curnode
);
curnode
= curnode
.leftNode
;
}
curnode
= stack
.pop();
curnode
= curnode
.rightNode
;
}
}
public void midorder(TreeNode curnode
){
Stack
<TreeNode> stack
= new Stack<>();
while(curnode
!= null
|| !stack
.isEmpty()){
while(curnode
!= null
){
stack
.push(curnode
);
curnode
= curnode
.leftNode
;
}
curnode
= stack
.pop();
System
.out
.print(curnode
.val
+" ");
curnode
= curnode
.rightNode
;
}
}
public void lastorder(TreeNode curnode
){
Stack
<TreeNode> stack
= new Stack<>();
TreeNode lastnode
= null
;
while(curnode
!= null
|| !stack
.isEmpty()){
while(curnode
!= null
){
stack
.push(curnode
);
curnode
= curnode
.leftNode
;
}
curnode
= stack
.pop();
if(curnode
.rightNode
== null
|| curnode
.rightNode
== lastnode
){
System
.out
.print(curnode
.val
+" ");
lastnode
= curnode
;
curnode
= null
;
}else{
stack
.push(curnode
);
curnode
= curnode
.rightNode
;
}
}
}
public static void main(String
[] args
) {
TreeNode root
= new TreeNode(6);
TreeNode node1
= new TreeNode(4);
TreeNode node2
= new TreeNode(3);
TreeNode node3
= new TreeNode(5);
TreeNode node4
= new TreeNode(8);
TreeNode node5
= new TreeNode(7);
TreeNode node6
= new TreeNode(9);
TreeNode node7
= new TreeNode(5);
root
.leftNode
= node1
;
root
.leftNode
.leftNode
= node2
;
root
.leftNode
.rightNode
= node3
;
root
.rightNode
= node4
;
root
.rightNode
.leftNode
= node5
;
root
.rightNode
.rightNode
= node6
;
root
.leftNode
.rightNode
.rightNode
= node7
;
DisPlayBinaryTree dt
= new DisPlayBinaryTree();
dt
.preorder(root
);
System
.out
.println();
dt
.midorder(root
);
System
.out
.println();
dt
.lastorder(root
);
System
.out
.println();
dt
.levelorder(root
);
}
public void levelorder(TreeNode curnode
){
Queue
<TreeNode> que
= new LinkedList<TreeNode>();
que
.add(curnode
);
while(!que
.isEmpty()){
curnode
= que
.poll();
System
.out
.print(curnode
.val
+" ");
if(curnode
.leftNode
!= null
){
que
.add(curnode
.leftNode
);
}
if(curnode
.rightNode
!= null
){
que
.add(curnode
.rightNode
);
}
}
}
}
TreeNode.java
public class TreeNode {
TreeNode leftNode
;
TreeNode rightNode
;
int val
;
public TreeNode() {
}
public TreeNode(int vl
) {
this.val
= vl
;
}
public TreeNode
getLeftNode() {
return leftNode
;
}
public void setLeftNode(TreeNode leftNode
) {
this.leftNode
= leftNode
;
}
public TreeNode
getRightNode() {
return rightNode
;
}
public void setRightNode(TreeNode rightNode
) {
this.rightNode
= rightNode
;
}
public int getVal() {
return val
;
}
public void setVal(int val
) {
this.val
= val
;
}
}