leetcode 102. 二叉树的层次遍历 及 103. 二叉树的锯齿形层次遍历

102. 二叉树的层次遍历

题目描述

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
    3
   / \
  9  20
    /  \
   15   7
返回其层次遍历结果:
[
  [3],
  [9,20],
  [15,7]
]

分析

本题的核心在于如何标记哪一些元素在同一个层次上,该解法使用一个size进行控制

代码

class Solution {
public:
    
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        vector<int> a;
        queue<TreeNode *> q;
        TreeNode* tmp;
        int size;
        if(root != NULL)
        {
            q.push(root);
            while(!q.empty())
            {
                size = q.size();
                for(int i = 0; i < size; i++)
                {
                    tmp = q.front();                    
                    a.push_back(tmp->val);
                    q.pop();
                    if(tmp->left != NULL)q.push(tmp->left);
                    if(tmp->right !=NULL)q.push(tmp->right);
                }
                ans.push_back(a);
                a.clear();
            }
        }
        return ans;       
    }
};

103. 二叉树的锯齿形层次遍历

问题描述

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回锯齿形层次遍历如下:
[
  [3],
  [20,9],
  [15,7]
]

分析

本题与上题解法一样,只不过加了个flag标记奇偶,但是开始犯了一个错误,在本步中先让左节点入队列,下一步就让右节点入队列,但是在测试例子[1,2,3,4,null,null,5],本该输出[[1],[3,2],[4,5]],结果却输出[[1],[3,2],[5,4]],因为这只考虑了一个节点左右的顺序,没有考虑整个一层的顺序,正确做法应该是还是按从左到右入队,但是在相应的步中做一个反转。

代码

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<int> a;
        vector<vector<int>> ans;
        queue<TreeNode *> q;
        TreeNode* tmp;
        int i,size,flag=0;
        
        if(root!= NULL)
        {
            q.push(root);
            while(!q.empty())
            {                
                size = q.size();                             
                for(i = 0; i < size; i++)
                {
                    tmp = q.front();
                    q.pop();
                    a.push_back(tmp->val);
                    if(tmp->left!=NULL)q.push(tmp->left);
                    if(tmp->right!=NULL)q.push(tmp->right);
                }
                if(flag%2 == 1)
                reverse(a.begin(),a.end());
                flag++;
                ans.push_back(a);
                a.clear();
             }
        }
        return ans;
    }
};
posted @ 2019-11-07 11:25  曲径通霄  阅读(202)  评论(0编辑  收藏  举报