这次开始讲不按照牛网上编排的顺序,因为三个二叉树打印的题目,它们的类型很相近,所以就放在了一起解析。
题目:
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
解析:
以如下二叉树为例(当然该二叉树为完全二叉树,可能不太合适,算法中考虑到没有孩子情况即可)
顺序打印序列:
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);}
输出结果: