一、前序、中序、後序遍歷方法
前序遍歷:先輸出父節點,在遍歷左子樹和右子樹 (根左右)
中序遍歷:先遍歷左子樹,在輸出父節點,在遍歷右子樹 (左根右)
後序遍歷:先遍歷左子樹,在遍歷右子樹,最後輸出父節點 (左右根)
(1)二叉樹前序遍歷算法思路:
準備:構建二叉樹,傳入某節點作爲當前節點
1.先輸出當前節點 //前序遍歷每次先輸出當前節點,在判斷是否有左子樹或右子樹
2.if(當前節點的左孩子節點不爲空)
遞歸前序遍歷
end
3.if(右節點不爲空) //當前節點的左孩子節點爲空時,在判斷是否有右孩子節點
遞歸前序遍歷
end
(2)二叉樹中序遍歷算法思路:
準備:構建二叉樹,傳入某節點作爲當前節點
1.if(當前節點的左孩子節點不爲空)
遞歸中序遍歷
else
輸出當前節點 //找不到左孩子節點就可以輸出當前節點了
end
2.if(當前節點的右孩子節點不爲空)/*1跟2的順序不能換,先從左子樹開始找,左子樹爲空時,在從最底層的右子樹開始向上找*/
遞歸中序遍歷
end
(3)二叉樹後序遍歷算法思路:
準備:構建二叉樹,傳入某節點作爲當前節點
1.if(當前節點的左孩子節點不爲空)
遞歸後序遍歷
end
2.if(當前節點的右孩子節點不爲空)
遞歸後序遍歷
end
3.輸出當前節點 //能輸出時說明前面兩項均不滿足,即當前節點既沒有左節點又沒有右節點
二、例題
根據下圖所示二叉樹,分別按照前序、中序、後序遍歷輸出該二叉樹
三、代碼實現
public class BinaryTreeDemo {
public static void main(String[] args)
{
BinaryTree binaryTree=new BinaryTree();
//手動創建二叉樹,測試
BinaryTreeNode root=new BinaryTreeNode(1);
BinaryTreeNode node2=new BinaryTreeNode(2);
BinaryTreeNode node3=new BinaryTreeNode(3);
BinaryTreeNode node4=new BinaryTreeNode(4);
BinaryTreeNode node5=new BinaryTreeNode(5);
BinaryTreeNode node6=new BinaryTreeNode(6);
//有節點了,構建出二叉樹
root.setLeft(node2);
root.setRight(node3);
node2.setLeft(node4);
node2.setRight(node5);
node4.setLeft(node6);//其餘節點默認爲左子樹或右子樹爲null
//設置根節點
binaryTree.setRoot(root);
//測試
System.out.println("前序遍歷");
root.preOrder();
System.out.println("中序遍歷");
root.midOrder();
System.out.println("後序遍歷");
root.postOrder();
}
}
//二叉樹類
class BinaryTree{
private BinaryTreeNode root;//定義根節點
public void setRoot(BinaryTreeNode root)
{
this.root=root;
}
//BinaryTree類前序遍歷代碼實現
public void preOrder()//BinaryTree類中的preOrder方法調用了同一包下的BinaryTreeNode類中重名的preOrder()方法,下同
{
if(this.root!=null)
{
this.root.preOrder();
}
else
{
System.out.println("二叉樹爲空,無法遍歷");
}
}
//BinaryTree類的中序遍歷代碼實現
public void minOrder()
{
if(this.root!=null)
{
this.root.midOrder();
}
else
{
System.out.println("二叉樹爲空,無法遍歷");
}
}
//BinaryTree類的後序遍歷代碼實現
public void postOrder()
{
if(this.root!=null)
{
this.root.postOrder();
}
else
{
System.out.println("二叉樹爲空,無法遍歷");
}
}
}
//二叉樹節點類
class BinaryTreeNode{
//二叉樹每個節點都有三個屬性:節點編號+左孩子+右孩子
private int val;
private BinaryTreeNode left; //默認null
private BinaryTreeNode right; //默認null
//有參構造方法定義
public BinaryTreeNode(int val){
super();
this.val=val;
}
//定義成員方法
public void setVal(int val)//1.設置二叉樹節點的值
{
this.val=val;
}
public void setLeft(BinaryTreeNode left)//2.設置節點爲當前節點的左孩子
{
this.left=left;
}
public void setRight(BinaryTreeNode right)//3.設置節點爲當前節點的右孩子
{
this.right=right;
}
public BinaryTreeNode getLeft()// 4.無參調用,返回值爲左孩子,類型爲BinaryTreeNode
{
return left;
}
public BinaryTreeNode getRight()//5.無參調用,返回值爲右孩子,類型爲BinaryTreeNode
{
return right;
}
@Override
public String toString()//6.改寫toString方法,打印節點編號時pringln使用
{
return "BinaryTreeNode[val="+val+"]";
}
//7.前序遍歷方法
public void preOrder()
{
System.out.println(this);//先輸出當前節點
if(this.left!=null)
{
this.left.preOrder();
}
if (this.right!=null)
{
this.right.preOrder();
}//棧存儲? 怎麼退回到上一層節點
}
//8.中序遍歷方法
public void midOrder()
{
if(this.left!=null)
{
this.left.midOrder();
}
System.out.println(this); //找不到左孩子節點就可以輸出當前節點了
if(this.right!=null)
{
this.right.midOrder();//先從左子樹開始找,左子樹爲空時,在從最底層的右子樹開始向上找
}
}
//9.後序遍歷方法
public void postOrder()
{
if(this.left!=null)
{
this.left.postOrder();
}
if(this.right!=null)
{
this.right.postOrder();
}
System.out.println(this);//能輸出時說明前面兩項均不滿足,即當前節點既沒有左節點又沒有右節點
}
}
代碼邏輯框架:
c 表示類,m表示方法,f表示成員變量
執行結果