1. 程式人生 > 其它 >2021/2/1 二叉樹的後序遍歷(leetcode 145)

2021/2/1 二叉樹的後序遍歷(leetcode 145)

技術標籤:c++leetcode資料結構與演算法

遞迴

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) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

此時我們實現了前後中遍歷的三種迭代法,是不是發現迭代法實現的先中後序,其實風格也不是那麼統一,除了先序和後序,有關聯,中序完全就是另一個風格了,一會用棧遍歷,一會又用指標來遍歷