题解 | #求二叉树的层序遍历#

求二叉树的层序遍历

http://www.nowcoder.com/practice/04a5560e43e24e9db4595865dc9c63a3

1、题目描述
给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)。
例如:给定的二叉树是{3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7

该二叉树层序遍历的结果是

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

层次遍历,通过队列来实现,整体思路就是先把根节点入队,然后出队,队为空就入前面出队的元素的左、右子树,不为空就继续出队头元素。
需要注意的是,题目给的返回值是二维类型,所以要额外定义一个辅助容器(一维类型)qvec,这个容器记录每层从左到右的元素,当该容器有元素的时候,就把他的内容输给res。

/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > levelOrder(TreeNode* root) {
        // write code here
        queue<TreeNode*> Queue;//利用队列实现
        vector<vector<int>> res;
        if(!root)
        {
            return res;
        }
        Queue.push(root);
        while(Queue.size()>0)
        {
            vector<int> qvec;
            int size = Queue.size();
            while(size>0)
            {
                TreeNode* node = Queue.front();
                qvec.push_back(node->val);
                Queue.pop();
                size--;
                if(node->left)
                    Queue.push(node->left);
                if(node->right)
                    Queue.push(node->right);
            }
            if(qvec.size()>0)
            {
                res.push_back(qvec);
            }
        }
        return res;
    }
};

2、题目描述
给定一个二叉树,返回该二叉树由底层到顶层的层序遍历,(从左向右,从叶子节点到根节点,一层一层的遍历)。
例如:给定的二叉树是{3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7

该二叉树由底层到顶层层序遍历的结果是

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

我的思路是采用一个队列和一个栈来实现。队列用来将树按照正常层序遍历的顺序存放,栈用来将输出顺序反转。

/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > levelOrderBottom(TreeNode* root) {
        // write code here
        vector<vector<int>> res;
        queue<TreeNode*> Queue; //注意队列中数据存放类型
        Queue.push(root);

        stack<vector<int>> Stack;//注意栈中的数据存放类型

        if(!root)
            return res;
        while(Queue.size()>0)
        {
            vector<int> qvec;
            int size = Queue.size();
            while(size>0)
            {
                TreeNode* node = Queue.front();
                qvec.push_back(node->val);
                Queue.pop();
                size--;
                if(node->left)
                    Queue.push(node->left);
                if(node->right)
                    Queue.push(node->right);
            }
            if(qvec.size()>0)
            {
                Stack.push(qvec);//将每层从左到右的节点存到的容器入栈
            }
        }
        while(Stack.size()>0)
        {
            vector<int> rvec = Stack.top();
            Stack.pop();
            res.push_back(rvec);
        }
        return res;
    }
};
牛客刷题记录 文章被收录于专栏

记录自己的刷题记录,刷过的题的解法

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务