题解 | #把二叉树打印成多行#

把二叉树打印成多行

http://www.nowcoder.com/practice/445c44d982d04483b04a54f298796288

解法一:递归

递归方法通过定义递归函数helper,遍历树的每一层,并将结果放入结果数组res的相应位置,因此需要定义level变量以记录当前访问到的层数。
在完成对某一凑层的遍历时,按照相同方式递归地访问左孩子和右孩子,且层数加1。

实现代码如下:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
        vector<vector<int> > Print(TreeNode* pRoot) {
            vector<vector<int> > res; 
            if (!pRoot) 
                return res; 
            helper(res, 0, pRoot); 
            return res;
        }
        void helper(vector<vector<int> > & res, int level, TreeNode* node) {
            if (!node) // 结点为空,直接返回
                return; 
            if (res.size() == level) { // 遍历到新的一层时
                vector<int> tmp; 
                res.push_back(tmp); 
            }
            res[level].push_back(node->val); // 保存结果(第level层)
            helper(res, level + 1, node->left); // 左孩子
            helper(res, level + 1, node->right); // 右孩子
        }

};

该方法遍历到树的每一个结点,时间复杂度为O(N);该方法在递归过程中需要用到栈空间,空间复杂度为O(N)。

解法二:非递归

此题即实现二叉树的「层次遍历」。

二叉树层次遍历的非递归实现利用到「队列」这一数据结构,具体步骤如下:

  1. 初始情况,根结点入队列;
  2. 定义变量size记录当前队列长度;
  3. 对于「当前队列」,遍历其所有元素:依次出队列、访问该元素、左右孩子入队列。注意:新入队列的「左右孩子」应当在下一层被访问,因此循环次数为size次。
  4. 重复上述步骤直至队列为空。

步骤如图所示。

图片说明

代码实现如下:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
        vector<vector<int> > Print(TreeNode* pRoot) {
            vector<vector<int> > res;
            if (!pRoot)
                return res;
            queue<TreeNode*> q; // 定义队列
            q.push(pRoot); // 根结点入队
            while (!q.empty()) {
                int size = q.size();
                vector<int> arr;
                for (int i = 0; i < size; i++) {
                    TreeNode* p = q.front();
                    q.pop();
                    if (p->left) q.push(p->left); // 左孩子入队
                    if (p->right) q.push(p->right); // 右孩子入队
                    if (!p) continue;
                    arr.push_back(p->val);
                }
                res.push_back(arr);
                arr.clear();
            }
            return res;
        }
};

该方法遍历到树的每一个结点,时间复杂度为O(N);该方法定义了队列q,空间复杂度为O(N)。

全部评论

相关推荐

泥给路哒油:真的不行了,以后趋势就是没有前后端职位之分了,我现在就是什么都干,有了ai就能干全栈,md年初目送一大堆同事毕业
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
4471次浏览 48人参与
# 离家近房租贵VS离家远但房租低,怎么选 #
16917次浏览 137人参与
# 米连集团26产品管培生项目 #
7383次浏览 226人参与
# 沪漂/北漂你觉得哪个更苦? #
1616次浏览 41人参与
# 你的实习产出是真实的还是包装的? #
3230次浏览 54人参与
# 春招至今,你的战绩如何? #
16021次浏览 146人参与
# 巨人网络春招 #
11540次浏览 228人参与
# HR最不可信的一句话是__ #
1107次浏览 32人参与
# AI面会问哪些问题? #
971次浏览 24人参与
# 你做过最难的笔试是哪家公司 #
1306次浏览 23人参与
# AI时代,哪个岗位还有“活路” #
2930次浏览 53人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152945次浏览 889人参与
# 简历第一个项目做什么 #
32180次浏览 363人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
8029次浏览 43人参与
# XX请雇我工作 #
51164次浏览 171人参与
# 简历中的项目经历要怎么写? #
311119次浏览 4271人参与
# 投格力的你,拿到offer了吗? #
178382次浏览 891人参与
# 你最满意的offer薪资是哪家公司? #
77008次浏览 375人参与
# AI时代,哪些岗位最容易被淘汰 #
64819次浏览 891人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187635次浏览 1123人参与
# 你怎么看待AI面试 #
180882次浏览 1318人参与
# 正在春招的你,也参与了去年秋招吗? #
364407次浏览 2642人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务