1. 程式人生 > >【二叉樹】二叉樹遍歷總結

【二叉樹】二叉樹遍歷總結

struct left else oot nor 節點 操作 preorder AC

  節點定義如下

1 // Definition for a binary tree node.
2 struct TreeNode {
3     int val;
4     TreeNode *left;
5     TreeNode *right;
6     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
7 }

  前序遍歷:

  若二叉樹為空,則空操作返回,否則:

  1. 訪問根節點
  2. 前序遍歷根節點的左子樹
  3. 前序遍歷根節點的右子樹

  中序遍歷:

  若二叉樹為空,則空操作返回,否則:

  1. 中序遍歷根節點的左子樹
  2. 訪問根節點
  3. 中序遍歷根節點的右子樹

  後序遍歷:

  若二叉樹為空,則空操作返回,否則:

  1. 後序遍歷根節點的左子樹
  2. 後序遍歷根節點的右子樹
  3. 訪問根節點  

1. 遞歸方法

  前序遍歷:

1 void preorderTraversal(TreeNode* root, vector<int>& nums) {
2     if(!root) return;
3     nums.push_back(root->val); // 訪問根節點
4     preorderTraversal(root->left); // 前序遍歷左子樹
5     preorderTraversal(root->right); //
前序遍歷右子樹 6 }

  中序遍歷:

void inorderTraversal(TreeNode* root, vector<int>& nums) {
    if(!root) return;   
    inorderTraversal(root->left, nums); // 中序遍歷左子樹
    nums.push_back(root->val);          // 訪問根節點
    inorderTraversal(root->right, nums); // 中序遍歷右子樹
} 

  後序遍歷:

1 void postorderTraversal(TreeNode* root, vector<int
>& nums) { 2 if(!root) return; 3 postorderTraversal(root->left, nums); // 後序遍歷左子樹 4 postorderTraversal(root->right, nums); // 後序遍歷右子樹 5 nums.push_back(root->val); // 訪問根節點 6 }

2.叠代方法(使用棧)

  前序遍歷:

void preorderTraversal(TreeNode* root, vector<int>& nums) {
    TreeNode* cur = root;
   stack
<TreeNode* > st; while (cur || !st.empty()) { if (!cur) { // 根節點為空,則需要返回上一級 cur = st.top(); // 訪問右子樹,而右子樹已被保存在棧中 st.pop(); } nums.push_back(cur->val); // 訪問根節點 if (cur->right) st.push(cur->right); // 保存待遍歷節點 cur = cur->left; // 繼續訪問左子樹 } }

  

中序遍歷:

 1 void inorderTraversal(TreeNode* root, vector<int>& nums) {
 2     TreeNode* cur = root;
 3     stack<TreeNode* > st; 
 4 
 5     while (cur || !st.empty()) {
 6         if (cur) {                                 // 找到最左節點並保存根節點
 7             st.push(cur);                     // 即訪問左子樹
 8             cur = cur->left;
 9         } else {                                  
10             cur = st.top();
11             st.pop();
12             nums.push_back(cur->val);    // 訪問根節點
13             cur = cur->right;                      // 訪問右子樹
14         }
15     }
16 } 

【二叉樹】二叉樹遍歷總結