剑指offer——从上往下打印二叉树

本文介绍了一种从上到下、从左至右打印二叉树节点的方法,并通过递归与迭代两种方式实现了该算法。文章总结了使用不同数据结构进行节点存储时的注意事项。

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

题目描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

 

将根节点存进vector后,把其左右节点先后放进队列,下次从队首取出一个节点,将该节点val存进vector,重复........

开始被返回值vector<int>所限制,存节点的容器也用了vector,但它根本没有pop_front方法,操作队首不方便。改成list,queue都报错,只存进了根节点。

原来是!!!result和temp的定义不能在递归函数里面,不然每次调用函数,temp都是新的,但怎么return是根节点而不是叶节点没弄明白(返回时怎么个递归的)。把两句定义拿出来,就可以啦。

#include<cstdlib>
#include<vector>
#include<queue>
class Solution {
public:
    vector<int> result;
    queue<TreeNode*> temp;
    vector<int> PrintFromTopToBottom(TreeNode* root) {

        if(root == NULL) return result;
        result.push_back(root->val);
        if(root->left != NULL)
        {
            temp.push(root->left);
        }
        if(root->right != NULL)
        {
            temp.push(root->right);
        }
        if(!temp.empty())
        {
            TreeNode* node = temp.front();
            temp.pop();
            PrintFromTopToBottom(node);
        }
         
        return result;
    }
};

调错总结:

(1)vector没有pop_front方法;

(2)虽说list和queue都可行,但要注意方法使用正确,不能混淆。list用的 push_back,pop_back。queue用的 push,pop。

注意deque与list方法类似。list是基于链表实现的,而deque是基于动态数组实现的。

所以啊,递归实现最好重写一个函数,在实现函数里面调用。

 

循环实现

#include<cstdlib>
#include<vector>
#include<list>
class Solution {
public:
    vector<int> PrintFromTopToBottom(TreeNode* root) {
        vector<int> result;
        list<TreeNode*> temp;
        if(root == NULL) return result;
        temp.push_back(root);
        while(temp.size())
        {
            TreeNode* pNode = temp.front();
            result.push_back(pNode->val);
            temp.pop_front();
            
            if(pNode->left)
                temp.push_back(pNode->left);
            if(pNode->right)
                temp.push_back(pNode->right);
        }
         
        return result;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值