<LeetCode OJ> 102. / 107. Binary Tree Level Order Traversal(I / II)

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

For example:
Given binary tree {3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7

return its level order traversal as:

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

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.


分析:

题目的意思是每一层均按照从左到右的顺序遍历节点,并记录节点到vector中。

显然广度优先搜索,用队列。利用两个队列保存当层的节点与下一层的节点,下一层的元素处理完后,下一层成为当层(继续获取下一层的节点),具体看代码便知!本代码一次性AC,看来我还是有所成长!

/**
 * 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:
    //从curque中获取他下一层的节点,放到nextque中,并且清空curque
    bool nextLevelNode(queue<TreeNode*> &curQue,queue<TreeNode*> &nextQue)
    {
        if(curQue.empty())
            return false;
        TreeNode* curNode=NULL;    
        while(!curQue.empty())
        {
            curNode=curQue.front();
            if(curNode->left!=NULL)
               nextQue.push(curNode->left);  
            if(curNode->right!=NULL)
               nextQue.push(curNode->right);   
            curQue.pop();//删除队首元素  
        }
        return !nextQue.empty();
    }
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector< vector<int> > result;
        if(root==NULL)
            return result;
        queue<TreeNode*> que1,que2;
        //一,获取最顶层的根
        vector<int> firstlevel;
        firstlevel.push_back(root->val);
        result.push_back(firstlevel);
        
        que1.push(root);
        //二,获取每一层的节点
        TreeNode* curNode=NULL; 
        while(nextLevelNode(que1,que2))
        {
            vector<int> curlevel;
            que1=que2;
            while(!que2.empty())//获取当层的节点
            {
                curNode=que2.front();
                curlevel.push_back(curNode->val);
                que2.pop();
            }
            result.push_back(curlevel);
        }
        return result;
    }
};

学习别人的解法:

class Solution {
public:
    
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector< vector<int> > result;
        if(root==NULL)
            return result;
        queue<TreeNode*> que;//用来总是保存当层的节点
        que.push(root);
        
        //获取每一层的节点
        while(!que.empty())
        {
            int levelNum = que.size();//通过size来判断当层的结束
            vector<int> curlevel;
            for(int i=0; i<levelNum; i++) 
            {
                if(que.front()->left != NULL) //先获取该节点下一层的左右子,再获取该节点的元素,因为一旦压入必弹出,所以先处理左右子
                    que.push(que.front()->left);
                if(que.front()->right != NULL) 
                    que.push(que.front()->right);
                    
                curlevel.push_back(que.front()->val);
                que.pop();
            }
            result.push_back(curlevel);
        }
        return result;
    }
};






Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).

For example:
Given binary tree {3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7

return its bottom-up level order traversal as:

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

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.


分析:

道理是一样的,不过就是插入vector的顺序逆着来而已,不过这样做似乎没有达到考察的目的!

/**
 * 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:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        vector< vector<int> > result;  
        if(root==NULL)  
            return result;  
        queue<TreeNode*> que;//用来总是保存当层的节点  
        que.push(root);  
          
        //获取每一层的节点  
        while(!que.empty())  
        {  
            int levelNum = que.size();//通过size来判断当层的结束  
            vector<int> curlevel;  
            for(int i=0; i<levelNum; i++)   
            {  
                if(que.front()->left != NULL) //先获取该节点下一层的左右子,再获取该节点的元素,因为一旦压入必弹出,所以先处理左右子  
                    que.push(que.front()->left);  
                if(que.front()->right != NULL)   
                    que.push(que.front()->right);  
                      
                curlevel.push_back(que.front()->val);  
                que.pop();  
            }  
            result.insert(result.begin(),curlevel);  //与上面问题的区别就在这里,仅此而已。
        }  
        return result; 
    }
};


注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/50719417

原作者博客:http://blog.csdn.net/ebowtang

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值