剑指 Offer 32 - I. 从上到下打印二叉树

本文介绍了一种从上到下打印二叉树节点的方法,确保同一层节点按从左到右顺序输出。通过秩实现按行输出,利用队列进行广度优先搜索,展示了两种队列实现方式。

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

例如:

给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]

提示:

节点总数 <= 1000

解题思路

通过二叉树的秩来实现按行输出的可能,将不同层次的数据从左到右依次存入数组中,再利用双重循环放入需要返回的数组中,实现层次输出。

代码展示

/**
 * 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 {
    vector<vector<int>>res = vector<vector<int>>(1000,vector<int>());
public:
    vector<int> Order(TreeNode* root, int k) {
        vector<int>T;
        if (root){
            res[k].push_back(root->val);
            Order(root->left, k+1);
            Order(root->right, k+1);
        }
        return T;
    }

    vector<int> levelOrder(TreeNode* root) {
        vector<int>result;
        if (root)
        {
            res[0].push_back(root->val);
            Order(root->left, 1);
            Order(root->right, 1);


            for (int i=0;!res[i].empty();i++)
                for (int j=0;j<res[i].size();j++)
                    result.push_back(res[i][j]);
        }
        return result;
    }
};

优化思路

利用队列这个容器将节点按顺序存储起来,整体看来类似于一次广度优先搜索(BFS),没存入一个跟结点的值,便将它下属节点存放到队列中。

队列代码展示

// 单队列
class Solution {
public:
    vector<int> levelOrder(TreeNode* root) {
        vector<int>res;

        if(root)
        {
            queue<TreeNode*>queueTreeNode;
            queueTreeNode.push(root);
            while(queueTreeNode.size())
            {
                TreeNode* pNode = queueTreeNode.front();
                queueTreeNode.pop();

                res.push_back(pNode->val);

                if(pNode->left)
                    queueTreeNode.push(pNode->left);
                if(pNode->right)
                    queueTreeNode.push(pNode->right);
            }
        }

        return res;
    }
};
// 双队列
class Solution {
public:
    vector<int> levelOrder(TreeNode* root) {
        vector<int>res;

        if(root)
        {
            deque<TreeNode*>dequeTreeNode;
            dequeTreeNode.push_back(root);
            while(dequeTreeNode.size())
            {
                TreeNode* pNode = dequeTreeNode.front();
                dequeTreeNode.pop_front();

                res.push_back(pNode->val);

                if(pNode->left)
                    dequeTreeNode.push_back(pNode->left);
                if(pNode->right)
                    dequeTreeNode.push_back(pNode->right);
            }
        }

        return res;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值