二叉樹遍歷的內容很多,但是也是最重要的,最需要理解的,很多二叉樹的相關演算法,只要用活了遍歷就沒有問題了對於每一棵樹,先遍歷其根節點,然後遍歷其左子樹,最後用同樣的方式遍歷右子樹
遞迴實現前序遍歷的過程太簡單了,這裡就不放了,直接說明二叉樹的非遞迴的前序遍歷實現:
如果不用遞迴實現前序遍歷,那麼就必須要用棧了,棧的作用是什麼呢?我覺得棧就是記錄了你的遍歷過程,而且可以告訴你下一次應該回溯到哪個節點,每一次取出棧頂的元素,都說明已經遍歷完這個棧頂節點的左子樹了。
思路也很簡單,就是每一次遇到乙個節點就放入棧中,因為是前序遍歷,所以先輸出根節點,然後遍歷左子樹,當發現左子樹遍歷完成後,根據前序遍歷的規則,此時需要遍歷右子樹,所以就取出棧頂節點,並遍歷棧頂節點的右子樹
btree* stack[50] = ;
int top = 0;
btree *now = root;
while(!isnull(now) || top)
now = stack[--top];
now = now->right;
}
對於每一棵樹,先遍歷其左子樹,然後遍歷其根節點,最後用同樣的方式遍歷右子樹
思路和前序遍歷差不多,但是這一次因為是中序遍歷,所以每一次取出棧頂節點時,說明左子樹遍歷完畢,那麼此時輸出中間節點,並遍歷右子樹,用棧很容易實現,但是這裡可以不用棧(這也是演算法導論的一道題)
void inorderwalk()
; int top = 0;
btree *now = root;
while(!isnull(now) || top)
now = stack[--top];
std::cout << now->key << std::endl;
now = now->right;
}}
last就承擔了stack的責任,stack其實有用的也是棧頂元素,這裡last承擔了這個棧頂元素的責任
void inorderwalknotusestack()
else
else
}else
}}}
//使用minimum函式和successor完成的中序遍歷
void inorderwalk2()
}
對於每一棵樹,先遍歷其左子樹,再遍歷右子樹,最後才遍歷根節點
後序遍歷比前兩種遍歷方式的麻煩之處在於,後序遍歷會兩次回溯根節點,因為在遍歷完左子樹以後,接下來要遍歷右子樹,而獲得右子樹必須要通過根節點獲得,這是第一次使用根節點,然後右子樹遍歷完以後,需要遍歷根節點了,此時第二次使用根節點。
所以必須要通過某種方式得知當前是第幾次遍歷這個根節點,有兩種方式:
void postorderwalk()
; int top = 0;
btree *now = root;
while(!isnull(now) || top)
//後序遍歷不能直接從棧中取節點,因為後序是先左再右,所以要先找右結點
//所以後序遍歷會取兩次節點,那麼什麼時候輸出這個節點呢,就要看當前節點和棧頂節點的關係了
//如果當前節點是棧頂節點的左子節點,那麼直接找右子節點,
//錯誤的想法:
//如果當前節點是棧頂結點的右子節點,那麼輸出並設定now為0,因為剛取出來的棧頂結點一定是已經遍歷完左子節點的
//這樣會導致死迴圈,正確的做法應該是不斷地取出棧頂元素,如果說當前結點是棧頂元素的右子節點,那麼繼續回溯
btree *p = stack[top - 1];
if(now == 0)
else
if(top == 0)
else
} }}
這三種裡我覺得中序和後序是最重要的,中序遍歷結果是排序的結果,後序遍歷的話特點就是左右子節點都遍歷完以後才會遍歷父節點,所以很多演算法會用到後序遍歷 基本資料結構 二叉樹(binary tree)
基本資料結構 二叉樹 binary tree c 二叉樹首先是一棵樹,每個節點都不能有多於兩個的兒子,也就是樹的度不能超過2。二叉樹的兩個兒子分別稱為 左兒子 和 右兒子 次序不能顛倒。如圖1是乙個簡單的二叉樹。二叉樹的種類 一種是滿二叉樹,除了最後一層的葉子節點外,每一層的節點都必須有兩個兒子節點...
資料結構學習(1) 二叉樹
二叉樹結構 public class treenode 前序遍歷 根結點,左子樹,右子樹 public static void prenode treenode node,listtreelist 中序遍歷 左子樹,根結點,右子樹 public static void midnode treenod...
資料結構學習筆記 二叉樹
樹,非線性表結構 樹有三個概念 高度從下向上數,起點是0 深度從上向下數,起點是0 層數從上向下數,起點是1 每個節點最多兩個叉 有兩種特殊二叉樹 滿二叉樹,除了葉子節點,每個節點都有左右兩個子節點 完全二叉樹,葉子節點都在最底下兩層,最後一層葉子節點都靠左排列,且除了最後一層,其它層節點個數都達到...