1 //結構體定義如下 2 struct TreeNode 3 { 4 char val; 5 TreeNode* left; 6 TreeNode* right; 7 TreeNode(char x) : val(x), left(NULL), right(NULL) {} 8 };
1. 前序遍歷
算法描述:對於當前節點,遵從順序:該節點 >> 左子樹 >> 右子樹,以上圖為例子,過程如下:
- 輸出 1 ,接着左子樹;
- 輸出 2 ,接着左子樹;
- 輸出 4 ,左子樹為空,再接着右子樹;
- 輸出 6 ,左子樹為空,再接着右子樹;
- 輸出 7 ,左右子樹均為空,此時 1 節點的左子樹全部輸出,則將輸出 節點 1 的右子樹;
- 輸出 3 ,接着左子樹;
- 輸出 5 ,左右子樹均為空,此時 1 節點的右子樹全部輸出,至此 1 的左右子樹全部輸出,結束。
遞歸代碼:
1 void pre_display(TreeNode* tree) 2 { 3 if( tree != NULL){ 4 cout << tree ->val << " "; 5 pre_display( tree ->left ); 6 pre_display( tree ->right ); 7 } 8 }
2. 中序遍歷
算法描述:對於當前節點,遵從順序:左子樹 >> 該節點 >> 右子樹,以上圖為例子,過程如下:
- 1 -> 2 -> 4,4 的左子樹為空,輸出 4,接着右子樹;
- 6 的左子樹為空,輸出 6 ,接着右子樹;
- 7 的左子樹為空,輸出 7,右子樹也為空,此時 2 的左子樹全部輸出,輸出 2,2 的右子樹為空,此時 1 的左子樹全部輸出,輸出 1,接着 1 的右子樹;;
- 3 -> 5,5 左子樹為空,輸出 5,右子樹也為空,此時 3 的左子樹全部輸出,而 3 的右子樹為空,至此 1 的右子樹全部輸出,結束。
遞歸代碼:
1 void vin_display(TreeNode* tree) 2 { 3 if( tree != NULL){ 4 vin_display( tree ->left ); 5 cout << tree ->val << " "; 6 vin_display( tree ->right ); 7 } 8 }
3. 后序遍歷
算法描述:對於當前節點,遵從順序:左子樹 >> 右子樹 >> 該節點,以上圖為例子,過程如下:
- 1 -> 2 -> 4 -> 6 -> 7,7 無左子樹 ,也無右子樹 ,輸出 7,此時 6 無左子樹 ,而 6 的右子樹也全部輸出,輸出 6,此時 4 無左子樹,而 4 的右子樹全部輸出,輸出 4,此時 2 的左子樹全部輸出,且 2 無右子樹,輸出 2,此時 1 的左子樹全部輸出,接着轉向右子樹;
- 3 -> 5,5 無左子樹 ,也無右子樹 ,輸出 5,此時 3 的左子樹全部輸出,且 3 無右子樹 ,輸出 3,此時 1 的右子樹全部輸出,輸出 1,結束。
遞歸代碼:
1 void post_display(TreeNode* tree) 2 { 3 if( tree != NULL){ 4 post_display( tree ->left ); 5 post_display( tree ->right ); 6 cout << tree ->val << " "; 7 } 8 }