【二叉樹】二叉樹遍歷總結
阿新 • • 發佈:2018-03-17
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. 遞歸方法
前序遍歷:
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 }
【二叉樹】二叉樹遍歷總結