1. 程式人生 > 實用技巧 >劍指 Offer 32 - III. 從上到下列印二叉樹 III - 8月13日

劍指 Offer 32 - III. 從上到下列印二叉樹 III - 8月13日

題目

劍指 Offer 32 - III. 從上到下列印二叉樹 III

我的思路

我的思路是按照題目要求的順序遍歷並列印。因為後一層遍歷的第一個節點可能是是前一層遍歷的最後一個節點的孩子,所以使用兩個棧,一個棧儲存當前層,另一個棧儲存下一層的節點。這樣自然相鄰兩層之間的訪問順序是相反的(要注意奇數或者偶數層訪問左右孩子的順序也不同)。按照訪問順序向結果列表新增元素即可。

我的實現

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 
*/ class Solution { public: deque<TreeNode*> *nowStack; deque<TreeNode*> *nextStack; void levelOrder(TreeNode *root,vector<vector<int>> &result){ bool left2right = true; nextStack = new deque<TreeNode*>; if(root!=nullptr){ nextStack
->push_back(root); } while(!nextStack->empty()){ vector<int> tempList; nowStack = nextStack; nextStack = new deque<TreeNode*>; while(!nowStack->empty()){ TreeNode* temp = nowStack->back(); nowStack
->pop_back(); tempList.push_back(temp->val); if(left2right==true){ if(temp->left!=nullptr){ nextStack->push_back(temp->left); } if(temp->right!=nullptr){ nextStack->push_back(temp->right); } }else{ if(temp->right!=nullptr){ nextStack->push_back(temp->right); } if(temp->left!=nullptr){ nextStack->push_back(temp->left); } } } result.push_back(tempList); left2right = !left2right; } } vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> result; levelOrder(root,result); return result; } }; /* 用兩個棧實現,一個棧存放當前遍歷層次的節點,另一個棧存放下一個層次的節點*/

拓展學習

官方題解的幾個思路與我稍稍不同:按照標準的層序遍歷並訪問各層的節點,再處理訪問得到的列表。

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        if (root==NULL)
            return res;
        bool flag = true; //從左向右列印為true,從右向左列印為false
        deque<TreeNode*> q;
        q.push_back(root);
        while (!q.empty())
        {
            int n = q.size();
            vector<int> out;
            TreeNode* node;
            while (n>0)
            {
                if (flag) // 前取後放:從左向右列印,所以從前邊取,後邊放入
                {
                    node = q.front();
                    q.pop_front();
                    if (node->left)
                        q.push_back(node->left);  // 下一層順序存放至尾
                    if (node->right)
                        q.push_back(node->right);
                }
                else  //後取前放: 從右向左,從後邊取,前邊放入
                {
                    node = q.back();
                    q.pop_back();
                    if (node->right)
                        q.push_front(node->right);  // 下一層逆序存放至首
                    if (node->left)
                        q.push_front(node->left);
                }
                out.push_back(node->val);
                n--;
            }
            flag = !flag;
            res.push_back(out);
        }
        return res;
    }
};

作者:bryceustc
連結:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/solution/cli-yong-dequeshuang-duan-dui-lie-hao-shi-0ms-ji-b/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。