您的位置:首页 > 其它

22、从上往下打印二叉树 && 59、把二叉树打印成多行

2017-05-27 11:01 351 查看
题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。

时间限制:1秒 空间限制:32768K

有类似的想法,不过想到了遍历vector却没想到用队列,就把问题复杂化了,所以这道题还是借鉴了别人的方法。

思路:广度优先算法(BFS)

用一个队列放入还没有打印(放入结果容器)的节点,只要队列不为空,循环执行打印的过程,每次取队列最前面一个,同时删除队列里的这一个,将这个节点的值放入结果容器,并把这一节点的左右子节点放到队列后面。

需要注意的一点:放入左右子节点时,不需要判断子节点是否为空,因为如果是空,相当于把空指针放入队列,在取出后会判断,如果该节点为空就continue了。

代码:

/*
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) {
if(root==NULL)
return vector<int>();
queue<TreeNode*> que;
que.push(root);
vector<int> res;
while(!que.empty()){
root = que.front();
que.pop();
if(root==NULL)
continue;
res.push_back(root->val);
que.push(root->left);
que.push(root->right);
}
return res;
}
};


后面一道相似的问题,59 把二叉树打印成多行

题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

思路:乍一看是和上一题相同的题目,区别就是需要按层分行打印,那么用什么来表示该换行了呢?

可以定义两个变量,一个变量表示在当前层中还没有打印的节点数,另一个变量表示下一层节点的数目。

代码:

/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > res;
vector<int> temp;
if(pRoot==NULL)
return res;
queue<TreeNode*> nodes;
nodes.push(pRoot);
int toBePrinted = 1;//本层还没打印的节点个数
int nextlevel = 0;//下一层节点个数
while(!nodes.empty()){
TreeNode* pNode = nodes.front();

nodes.pop();
toBePrinted--;

temp.push_back(pNode->val);

if(pNode->left!=NULL){
nodes.push(pNode->left);
nextlevel++;
}
if(pNode->right!=NULL){
nodes.push(pNode->right);
nextlevel++;
}

if(toBePrinted==0){//本层打印完了
res.push_back(temp);
temp.clear();
toBePrinted = nextlevel;//开始打印下一层
nextlevel = 0;//清空下一层的节点数
}

}
return res;
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: