从上往下打印二叉树
- 参与人数:3884时间限制:1秒空间限制:32768K
- 算法知识视频讲解
题目描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
相当于实现树的层序遍历,构造一个队列,我使用了尾递归。
// 21.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#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> retVec;
if (root == NULL) return retVec;
vector<TreeNode*> queue;
queue.push_back(root);
get(root, queue);
for (vector<TreeNode*>::iterator it = queue.begin(); it != queue.end(); it++) {
retVec.push_back((*it)->val);
}
return retVec;
}
void get(TreeNode* root, vector<TreeNode*>& queue) {
if (root == NULL) return;
//queue.push_back(root);
if (root->left != NULL) {
queue.push_back(root->left);
}
if (root->right != NULL) {
queue.push_back(root->right);
}
get(root->left, queue);
get(root->right, queue);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
TreeNode r(10);
TreeNode left1(6);
TreeNode right1(14);
TreeNode left2(4);
TreeNode right2(8);
TreeNode left3(12);
TreeNode right3(16);
r.left = &left1;
r.right = &right1;
left1.left = &left2;
left1.right = &right2;
right1.left = &left3;
right1.right = &right3;
Solution s;
s.PrintFromTopToBottom(&r);
return 0;
}
一开始我把
queue.push_back(root);
写在get函数中,这是错误的,可以打断点试试。
第二次做:
看第一次写的代码感觉好复杂啊~~
由于是层序访问二叉树,所以可以用队列来装载树的节点,我想到了用deque来实现队列,deque两端都可以进出,非常方便。关于deque的详细信息,请看我的一遍博客:
STL简单deque的实现
/*
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> retVec ;
if ( root == NULL ) return retVec ;
deque<TreeNode*> stack ;
stack.push_back( root ) ;
while ( stack.empty() != true ) {
TreeNode* node = stack.front() ;
retVec.push_back( node->val ) ;
stack.pop_front() ;
if ( node->left ) stack.push_back( node->left ) ;
if ( node->right ) stack.push_back( node->right ) ;
}
return retVec ;
}
};
第三次做:
/*
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> vec ;
if ( root == NULL ) return vec ;
deque<TreeNode*> que ;
que.push_back( root ) ;
while ( que.empty() == false ) {
TreeNode* tmp = que.front() ;
vec.push_back( tmp->val ) ;
if ( tmp->left != NULL ) que.push_back( tmp->left ) ;
if ( tmp->right != NULL ) que.push_back( tmp->right) ;
que.pop_front() ;
}
return vec ;
}
};