剑指Offer(七)二叉树打印系列-从上往下打印二叉树

这次开始讲不按照牛网上编排的顺序,因为三个二叉树打印的题目,它们的类型很相近,所以就放在了一起解析。

题目:

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

解析:

以如下二叉树为例(当然该二叉树为完全二叉树,可能不太合适,算法中考虑到没有孩子情况即可)


顺序打印序列:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

本题的关键在于寻找合适的数据容器,能够使得打印可以顺序进行。对于这个问题来说,双向队列无疑是最好的选择(先进先出),每次pop一个结点出去的时候,就顺便把它的左右孩子都加入到队列的尾端。操作顺序如下:


程序代码:

#include<iostream>
#include<deque>
#include<vector>
using namespace std;
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {  
 vector<int> r;
    if(!root)
        return r;
    deque<TreeNode*> p;
    p.push_back(root);
    while(p.size())
    {
        TreeNode *node=p.front();
        cout<<node->val<<" ";
        r.push_back(node->val);
        p.pop_front();
        if(node->left)
            p.push_back(node->left);
        if(node->right)
            p.push_back(node->right);
    }
    return r;

}};int main(){ TreeNode *t1=new TreeNode(1); TreeNode *t2=new TreeNode(2); TreeNode *t3=new TreeNode(3); TreeNode *t4=new TreeNode(4); TreeNode *t5=new TreeNode(5); TreeNode *t6=new TreeNode(6); TreeNode *t7=new TreeNode(7); TreeNode *t8=new TreeNode(8); TreeNode *t9=new TreeNode(9); TreeNode *t10=new TreeNode(10); TreeNode *t11=new TreeNode(11); TreeNode *t12=new TreeNode(12); TreeNode *t13=new TreeNode(13); TreeNode *t14=new TreeNode(14); TreeNode *t15=new TreeNode(15); t1->left=t2; t1->right=t3; t2->left=t4; t2->right=t5; t3->left=t6; t3->right=t7; t4->left=t8; t4->right=t9; t5->left=t10; t5->right=t11; t6->left=t12; t6->right=t13; t7->left=t14; t7->right=t15; Solution s; s.PrintFromTopToBottom(t1);}

输出结果:


猜你喜欢

转载自blog.csdn.net/bubbler_726/article/details/80972437