二叉樹 樹的前序遍歷、中序遍歷、后序遍歷詳解


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. 輸出 1 ,接着左子樹;
  2. 輸出 2 ,接着左子樹;
  3. 輸出 4 ,左子樹為空,再接着右子樹;
  4. 輸出 6 ,左子樹為空,再接着右子樹;
  5. 輸出 7 ,左右子樹均為空,此時 1 節點的左子樹全部輸出,則將輸出 節點 1 的右子樹;
  6. 輸出 3 ,接着左子樹;
  7. 輸出 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. 1 -> 2 -> 4,4 的左子樹為空,輸出 4,接着右子樹;
  2. 6 的左子樹為空,輸出 6 ,接着右子樹;
  3. 7 的左子樹為空,輸出 7,右子樹也為空,此時 2 的左子樹全部輸出,輸出 2,2 的右子樹為空,此時 1 的左子樹全部輸出,輸出 1,接着 1 的右子樹;;
  4. 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. 1 -> 2 -> 4 -> 6 -> 7,7 無左子樹 ,也無右子樹 ,輸出 7,此時 6 無左子樹 ,而 6 的右子樹也全部輸出,輸出 6,此時 4 無左子樹,而 4 的右子樹全部輸出,輸出 4,此時 2 的左子樹全部輸出,且 2 無右子樹,輸出 2,此時 1 的左子樹全部輸出,接着轉向右子樹;
  2. 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  }

 

部分參考自https://www.cnblogs.com/jpfss/p/11141956.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM