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;
}

猜你喜欢

转载自blog.csdn.net/qq_23523409/article/details/83744934