层次遍历(记录层数) 引入哨兵的简化计算 Binary Tree Zigzag Level Order Traversal

以 求二叉树 奇数层和偶数层 的层次遍历和为例 

class Solution {
public:
    /* 层次遍历找奇数层和偶树层 哪个最大 ?
     * oddsum evensum
     * 虽然这道题的思路错了  但是提供了一个很好的记录层数的层次遍历方法 : 引入哨兵
     * */
    int rob(TreeNode* root) {
        // 设立哨兵的层次遍历 插入空
        queue<TreeNode*> q;
        q.push(root);
        q.push(NULL);
        int oddsum = 0, evensum=0, index=0, laysum=0;
        while(q.size() > 1){ // 队列中至少有一个哨兵节点 当队列中只有最后一次加入的哨兵节点时说明层次遍历结束
            TreeNode *tmp = q.front();
            q.pop();
            if(tmp == NULL){
                if(index == 0){  // 偶数层
                    index = 1;
                    evensum += laysum;
                    //cout<<evensum<<"even"<<endl;
                }
                else{
                    index = 0;
                    oddsum += laysum;
                    //cout<<oddsum<<"odd"<<endl;
                }
                laysum = 0;
                q.push(NULL);
            }
            else {
                laysum += tmp->val;
                if(tmp->left) q.push(tmp->left);
                if(tmp->right)  q.push(tmp->right);
            }
        }
        // 最后一层对列eg: NULL 3 1 处理完3后下次就只剩一个NULL了(因为没有新的节点加入)
        if(index == 0)  evensum += laysum;
        else oddsum += laysum;
        return max(oddsum, evensum);
    }
};

Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

For example:
Given binary tree [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its zigzag level order traversal as:

[
  [3],
  [20,9],
  [15,7]
]
class Solution {
public:
    /* 引入哨兵的层次遍历
     * inverse=false(初始) 一次遍历后置为相反
     * 注意while循环中的条件  队列中至少会有一个NULL 因此size>1
     * */
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        if(!root)   return {};
        vector<vector<int>> ret;
        vector<int> tmpans;
        queue<TreeNode*> q;
        q.push(root);
        q.push(NULL);
        bool inverse=false;
        while(q.size()>1 || !tmpans.empty()){// tmpans 在最后一次记录后会被清空如果不加这个条件最后一层的结果不会被计入
            auto tmp = q.front();
            q.pop();
            if(!tmp){
                if(inverse){
                    reverse(tmpans.begin(), tmpans.end());
                    inverse=false;
                } else  inverse=true;
                
                ret.push_back(tmpans);
                tmpans.clear();
                q.push(NULL);
            }
            else{
                tmpans.push_back(tmp->val);
                if(tmp->left)   q.push(tmp->left);
                if(tmp->right)  q.push(tmp->right);
            }
        }
        return ret;
    }
};

猜你喜欢

转载自blog.csdn.net/futangxiang4793/article/details/88738044
今日推荐