/** 二叉樹節點 */
public class btnode
public btnode(char key, btnode left, btnode right)
public char getkey()
public void setkey(char key)
public btnode getleft()
public void setleft(btnode left)
public btnode getright()
public void setright(btnode right)
}/** 二叉樹遍歷 */
public class bintree
public btnode getroot()
/** 構造樹 */
public static btnode init()
/** 訪問節點 */
public static void visit(btnode p)
/** 遞迴實現前序遍歷 */
protected static void preorder(btnode p)
} /** 遞迴實現中序遍歷 */
protected static void inorder(btnode p)
} /** 遞迴實現後序遍歷 */
protected static void postorder(btnode p)
} /** 非遞迴實現前序遍歷 */
protected static void iterativepreorder(btnode p)
}} /** 非遞迴實現後序遍歷 */
protected static void iterativepostorder(btnode p)
// 處理右子
stack.push(p);
p = p.getright();
}} /** 非遞迴實現中序遍歷 */
protected static void iterativeinorder(btnode p)
p = stack.pop();
while (!stack.empty() && p.getright() == null)
visit(p);
if (!stack.empty())
p = stack.pop();
else
p = null;
}} public static void main(string args)
}
遍歷是對樹的一種最基本的運算,所謂遍歷二叉樹,就是按一定的規則和順序走遍二叉樹的所有結點,使每乙個結點都被訪問一次,而且只被訪問一次。由於二叉樹是非線性結構,因此,樹的遍歷實質上是將二叉樹的各個結點轉換成為乙個線性序列來表示。
設l、d、r分別表示遍歷左子樹、訪問根結點和遍歷右子樹, 則對一棵二叉樹的遍歷有三種情況:dlr(稱為先根次序遍歷),ldr(稱為中根次序遍歷),lrd (稱為後根次序遍歷)。
(1)先序遍歷
訪問根;按先序遍歷左子樹;按先序遍歷右子樹
(2)中序遍歷
按中序遍歷左子樹;訪問根;按中序遍歷右子樹
(3)後序遍歷
按後序遍歷左子樹;按後序遍歷右子樹;訪問根
(4)層次遍歷
即按照層次訪問,通常用佇列來做。訪問根,訪問子女,再訪問子女的子女(越往後的層次越低)(兩個子女的級別相同)
思想:用乙個佇列儲存被訪問的當前節點的左右孩子以實現層序遍歷。void hierarchybitree(bitree root)
destroyqueue(q); // 釋放佇列空間
return ;
二叉樹遍歷(遞迴 非遞迴)
二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...
二叉樹非遞迴遍歷
二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...
非遞迴遍歷二叉樹
中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...