1. 程式人生 > >Leetcode:103. 二叉樹的鋸齒形層次遍歷

Leetcode:103. 二叉樹的鋸齒形層次遍歷

給定一個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。

例如:
給定二叉樹 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回鋸齒形層次遍歷如下:

[
  [3],
  [20,9],
  [15,7]
]

解題思路:

解題的大致思路是廣度優先搜尋的思路,但有點小小的改動。按題目意思,奇數行順序訪問(從左往右),偶數行逆序訪問(從右往左)。二叉樹的訪問,如果是順序訪問,如果要保證孩子的順序不亂,那麼應該先儲存左孩子(left),再儲存右孩子(right);相反,如果是逆序訪問,如果要保證孩子的順序不亂,那麼應該先儲存右孩子(right),再儲存左孩子(left);隨後再考慮訪問孩子的先後順序,觀察可發現,每一層都是先儲存的值後訪問,很顯然應該用(棧)Stack儲存孩子節點。

 

另外,發現做二叉樹的題,本題除錯不太方便,需要將[3,9,20,null,null,15,7]轉變成二叉樹,於是又編寫了個整型陣列轉二叉樹的函式,本次也算是買一贈一。

C++程式碼
class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        if (root == NULL) return{};
        vector<vector<int>> res = {};
        vector<int> INT = {};
        stack<TreeNode*> S,S_temp;
        S.push(root);
        int sgn = 1; TreeNode* temp;
        while (!S.empty()) {
            INT = {};
            int size = S.size();
            while (!S_temp.empty()) S_temp.pop();
            for (int i = 1; i <= size; i++) {
                if (sgn % 2 == 1) {
                    temp = S.top();
                    if (temp != NULL) {
                        INT.push_back(temp->val);
                        S_temp.push(temp->left);
                        S_temp.push(temp->right);
                    }
                }
                else {
                    temp = S.top();
                    if (temp != NULL) {
                        INT.push_back(temp->val);
                        S_temp.push(temp->right);
                        S_temp.push(temp->left);
                    }
                }
                S.pop();
            }
            S = S_temp;
            sgn++;
            if (int(INT.size()) > 0) { res.push_back(INT); }
        }
        return res;
    }
};

 

買一贈一
TreeNode* Int2Tree(vector<int> data) {
    TreeNode* root;
    int size = data.size(), pos = 1;
    if (size == 0) root = NULL;
    root = new TreeNode(data[0]);
    queue<TreeNode*> Q;
    TreeNode* temp;
    Q.push(root);
    while (pos < size) {    
        if (!Q.empty()) {
            temp = Q.front();
            if (data[pos] != NULL) { 
                temp->left = new TreeNode(data[pos]);
                Q.push(temp->left);
                
            }
            if ((pos + 1 < size) && data[pos + 1] != NULL) {
                temp->right = new TreeNode(data[pos + 1]);
                Q.push(temp->right);
            }
            Q.pop();
        }
        pos += 2;
    }
    return root;
}