Binary Tree Level Order Traversal II(层次遍历二叉树II)

本文介绍了一种二叉树自底向上层次遍历的方法,包括使用队列的迭代实现和个人提出的递归解法。两种方法都能有效地解决自底向上层次遍历的问题,并对实现过程进行了详细的说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,null,null,15,7],

 3
/ \
9  20
  /  \
 15   7

return its bottom-up level order traversal as:

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

1.个人分析
先考虑自顶向下的情况,利用层次遍历将每层的节点分别保存到二维数组的每一行,最后将结果进行反转返回即可。

2.个人解法

vector<vector<int>> levelOrderBottom(TreeNode* root) 
{
    vector<vector<int>> result;
    if(!root)
        return result;
    queue<TreeNode*> Q;
    Q.push(root);

    int level = 0;      //层次数从0开始,以适配二维数组行号
    while(!Q.empty()){
        int len = Q.size(); //记录每层所含的节点数        
        while(len-- > 0){
            TreeNode *node = Q.front();
            if(level == result.size()){
                result.push_back({node->val});//将节点保存到新的一行,该语句只在C++ 11以后的标准支持
            }else {
                result[level].push_back(node->val); //保存节点到当前行
            }
            Q.pop();
            if(node->left)
                Q.push(node->left);
            if(node->right)
                Q.push(node->right);                
        }
        ++level;
    }
    reverse(result.begin(), result.end());  //将结果逆序返回
    return result;
}

3.参考解法
递归求解:

void levelOrderTop(TreeNode* r, int level, vector<vector<int>>& res) 
{
    if (!r) return;

    if (level == res.size()){
        res.push_back({r->val}); 
    }else 
        res[level].push_back(r->val); 

    levelOrderTop(r->left, level+1,res);
    levelOrderTop(r->right, level+1,res);
}

vector<vector<int>> levelOrderBottom(TreeNode* root) 
{
    vector<vector<int>> res;
    levelOrderTop(root, 0, res); 
    reverse(res.begin(), res.end());
    return res;
}

该递归解法确实要比非递归解法简洁很多,但递归方法在效率和易读性上要差的多。

4.总结
刚开始是自己把问题复杂化了,想了很久也没有想出比较好的解法,原因是自己对二叉树的层次遍历还没达到一个灵活运用的地步。后来通过查阅与层次遍历相关的资料和参考他人的递归解法后才最解决了该问题,另外自己在vector作为二维数组时如何开辟新的一行也遇到了困难,后来发现在C++11中是支持花括号初始化vector的,通过push_back开辟新行的问题也就迎刃而解了。

PS:

  • 题目的中文翻译是本人所作,如有偏差敬请指正。
  • 其中的“个人分析”和“个人解法”均是本人最初的想法和做法,不一定是对的,只是作为一个对照和记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值