2021/2/1 二叉樹的後序遍歷(leetcode 145)
阿新 • • 發佈:2021-02-16
遞迴
class Solution {
public:
//遞迴
void Traversal(TreeNode* root,vector<int>& result)
{
if(root==nullptr) return;
if(root->left) Traversal(root->left,result);
if(root->right) Traversal(root->right,result);
result. push_back(root->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
Traversal(root,result);
return result;
}
};
注意: 總是忘記 result.push_back(root->val);
中的root->val
非遞迴
再來看後序遍歷,先序遍歷是中左右,後續遍歷是左右中,那麼我們只需要調整一下先序遍歷的程式碼順序,就變成中右左的遍歷順序,然後在反轉result陣列,輸出的結果順序就是左右中了,如下圖:
所以後序遍歷只需要前序遍歷的程式碼稍作修改就可以了,程式碼如下
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
if (root == NULL) return result;
st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);
if (node->left) st.push(node->left); // 相對於前序遍歷,這更改一下入棧順序 (空節點不入棧)
if (node->right) st.push(node->right); // 空節點不入棧
}
reverse(result.begin(), result.end()); // 將結果反轉之後就是左右中的順序了
return result;
}
};
作者:carlsun-2
連結:https://leetcode-cn.com/problems/binary-tree-preorder-traversal/solution/dai-ma-sui-xiang-lu-chi-tou-qian-zhong-hou-xu-de-d/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
此時我們實現了前後中遍歷的三種迭代法,是不是發現迭代法實現的先中後序,其實風格也不是那麼統一,除了先序和後序,有關聯,中序完全就是另一個風格了,一會用棧遍歷,一會又用指標來遍歷