二叉樹的遍歷可分為兩種:深度遍歷和廣度遍歷
深度遍歷又分為三種:前序、中序、後序遍歷,這三種遍歷方式可以用遞迴或棧來實現
廣度遍歷:即層序遍歷, 可以用佇列來實現
以如下的二叉樹為例,遍歷該二叉樹。
a.建立節點類
public class treenode
}
b.根據二叉樹圖建立節點集合
public static void main(string args)
c.遍歷二叉樹
//前序遍歷
public static void preorder(treenode tn)
system.out.print(tn.data+" ");
preorder(tn.leftchild);
preorder(tn.rightchild);
}//中序遍歷
public static void inorder(treenode tn)
inorder(tn.leftchild);
system.out.print(tn.data+" ");
inorder(tn.rightchild);
}//後序遍歷
public static void postorder(treenode tn)
postorder(tn.leftchild);
postorder(tn.rightchild);
system.out.print(tn.data+" ");
}
d.遍歷結果
3 2 9 1 8 5 7
2 1 9 8 3 5 7
1 8 9 2 7 5 3
與遞迴不同的是,使用棧來遍歷二叉樹屬於使用中間變數-棧來輔助遍歷,步驟a、b與使用遞迴遍歷的相同
c.遍歷二叉樹
1、前序:入棧就列印輸出節點資料,即節點訪問的順序等於遍歷順序(從根節點開始訪問,先訪問左子樹,若左子樹不為空則把該左子樹對應的 節點x 入棧,繼續訪問 節點x 的左子樹。迴圈直到左子樹為空,假設當前節點為y。則節點y出棧,訪問節點y的右子樹。繼續迴圈直到棧為空)
stackstack = new stack();
treenode tn=root;
while(tn!=null||!stack.isempty())
tn = stack.pop();
tn = tn.rightchild;
}
2、中序:出棧就列印節點資料,即節點出棧順序等於遍歷順序(其他的與前序相同)
stackstack = new stack();
treenode tn=root;
while(tn!=null||!stack.isempty())
tn = stack.pop();
system.out.print(tn.data+" ");
tn = tn.rightchild;
}
3、後續:增加乙個輔助棧,記錄所有節點(與前序不同的地方在於,先遍歷右子樹,將訪問到的所有節點入棧2,棧2的出棧順序就是遍歷順序)
stackstack = new stack();
stackstack2 = new stack();
tn=root;
while(tn!=null||!stack.isempty())
tn = stack.pop();
tn = tn.leftchild;
}int n = stack2.size();
for (int i = 0; i < n; i++)
d.結果
3 2 9 1 8 5 7
2 1 9 8 3 5 7
1 8 9 2 7 5 3
層序遍歷, 可以用佇列來實現
//層序遍歷
public static void levelorder(treenode tn)
}
遞迴遍歷二叉樹
include include include 二叉鍊錶表示法 typedef struct tag bitnode bitnode 先序遍歷 void xianxuorder bitnode root 先根 printf c root data 左子樹 xianxuorder root lchil...
二叉樹遞迴遍歷
編寫簡單的程式對下圖二叉樹進行遍歷 先訪問根節點 printf c root ch 再遍歷左子樹 recursion root lchild 再遍歷右子數 recursion root rchild 再遍歷左子樹 recursion root lchild 先訪問根節點 printf c root ...
二叉樹的遞迴遍歷
所謂二叉樹的遍歷,本質上就是沿某條搜尋路徑訪問樹中的每個結點,使得每個節點均被訪問一次,而且僅被訪問一次。由二叉樹的基本定義可以知道,遍歷一顆二叉樹首先必須決定對根結點 n 左子樹 l 右子樹 r 的訪問順序,按照先遍歷左孩子再遍歷右孩子的原則,常見的遍歷次序有先序遍歷 nlr 中序遍歷 lnr 和...