题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入图4.5中

的二叉树,则依次打印出8、6、10、5、7、9、11二叉树结点的定义如下:

 struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};

我们以如下二叉树为例:

                /  \

              / \  / \
                  

这道题实际上二叉树层次遍历方法:

解题步骤如下:

1.设置一个deque双端队列,将根节点加入队列

2.首先从队头取出根节点,输出根节点的数据值。同时将根节点的左右子结点加入队列,此时队列里面的节点为 6、10

3.从队头取出节点6,同时加入节点6的左右节点到队列尾,此时队列节点10、5、7

4.从队头取出节点10,同时加入节点10的左右节点到对尾,此时队列节点为5、7、9、11

5.此时取出队头节点5,节点5没有左右子节点则输出不必加队列

5。重复直到队列中元素全部取出后,层次遍历便完成了。

代码实现如下:

 #include <iostream>
#include <deque>
using namespace std; struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
}; void CreateTree(BinaryTreeNode** Root)
{
int data;
cin>>data;
if(data==)
{
*Root=NULL;
return;
}
else
{
*Root=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
(*Root)->m_nValue=data;
CreateTree(&((*Root)->m_pLeft));
CreateTree(&((*Root)->m_pRight));
}
} void PreOrder(BinaryTreeNode* Root)
{
if(Root==NULL)
return; PreOrder(Root->m_pLeft);
cout<<Root->m_nValue<<endl;
PreOrder(Root->m_pRight);
} void LevelOrder(BinaryTreeNode* Root)
{
if(Root==NULL)
return; deque<BinaryTreeNode*> D; D.push_back(Root); while(!D.empty())
{
BinaryTreeNode* TempNode=D.front();
D.pop_front();
cout<<TempNode->m_nValue<<","; if(TempNode->m_pLeft!=NULL)
{
D.push_back(TempNode->m_pLeft);
}
if(TempNode->m_pRight!=NULL)
{
D.push_back(TempNode->m_pRight);
}
}
} int main()
{
BinaryTreeNode* root;
cout<<"Please input the tree node data(0-exit):\n";
CreateTree(&root);
cout<<"The PreOrder of Binary Tree:\n";
PreOrder(root);
cout<<endl;
cout<<"The LevelOrder Of Binary Tree: ";
LevelOrder(root);
cout<<endl;
return ;
}

运行截图:

 

剑指offer-面试题23.从上往下打印二叉树的更多相关文章

  1. 剑指Offer:面试题23——从上往下打印二叉树(java实现)

    问题描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 按照层次遍历的方法,使用队列辅助. 1.将根结点加入队列. 2.循环出队,打印当前元素,若该结点有左子树,则将其加入队列,若 ...

  2. 剑指Offer - 九度1523 - 从上往下打印二叉树

    剑指Offer - 九度1523 - 从上往下打印二叉树2013-12-01 00:35 题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以E ...

  3. 剑指offer(22)从上往下打印二叉树

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题目分析 从下打印就是按层次打印,其实也就是树的广度遍历. 一般来说树的广度遍历用队列,利用先进先出的特点来保存之前节点,并操作之前的 ...

  4. 【剑指offer】不分行从上到下打印二叉树,C++实现(层序遍历)

    原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印.例如: 图  不分行从上往下按层打印二叉 ...

  5. 【剑指Offer】22、从上往下打印二叉树

      题目描述:   从上往下打印出二叉树的每个节点,同层节点从左至右打印.   解题思路:   本题实际上就是二叉树的层次遍历,深度遍历可以用递归或者栈,而层次遍历很明显应该使用队列.同样我们可以通过 ...

  6. 剑指offer_面试题_从上往下打印二叉树

    题目:从上往下打印出二叉树的每一个结点.同一层的结点依照从左到右的顺序打印.比如输入图4.5中的二叉树.则依次打印出8.6.10.5.7.9.11. 8 /     \ 6     10 /   \ ...

  7. 《剑指offer》面试题23 从上往下打印二叉树 Java版

    注意层序遍历的时候对每一层的处理方式可能不同,这里把每一层的元素保存进一个List中了,那么就需要记录每一层的数量. public List<List<Integer>> se ...

  8. 面试题23从上到下打印二叉树+queue操作

    //本题思路就是层次遍历二叉树,使用一个队列来模拟过程 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *ri ...

  9. C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解

    剑指offer  面试题23:从上往下打印二叉树 参与人数:4853  时间限制:1秒  空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...

随机推荐

  1. unix c 05

    dup和dup2用于复制文件描述符,区别在于dup2可以指定新的文件描述符的数值,如果新的文件描述符的值已经被使用,dup2会关闭掉后进行复制. dup和dup2 不会复制文件表,只是文件描述符的复制 ...

  2. Spark机器学习笔记一

    Spark机器学习库现支持两种接口的API:RDD-based和DataFrame-based,Spark官方网站上说,RDD-based APIs在2.0后进入维护模式,主要的机器学习API是spa ...

  3. 【布艺DIY】 零基础 做包包 2小时 就OK!_豆瓣

    [布艺DIY] 零基础 做包包 2小时 就OK!_豆瓣 [布艺DIY] 零基础 做包包 2小时 就OK!

  4. 《Java程序员面试笔试宝典》之volatile有什么作用

    在由Java语言编写的程序中,有时候为了提高程序的运行效率,编译器会自动对其进行优化,把经常被访问的变量缓存起来,程序在读取这个变量的时候有可能会直接从缓存(例如寄存器)中来读取这个值,而不会去内存中 ...

  5. nyoj 36 最长公共子序列

    描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subseque ...

  6. C++ Primer笔记1_转义字符_标准库类型string_标准库类型vector

    1.转义字符 一般有两种方式: \x后紧跟1个或多个十六进制数字.或\后紧跟1.2.3个八进制数字,当中数字部分是字符相应的数值. #include <iostream> using na ...

  7. Linux下Ant的安装

    OS:CentOS6.3 ant版本:apache-ant-1.9.2-bin 第1步:下载ant apache-ant-1.9.2-bin.tar.gz 第2步:解压 tar -zxvf apach ...

  8. oracle数据库recover和restore的区别

    restore just copy the physical file, recover will consistent the database.restore 是还原,文件级的恢复.就是物理文件还 ...

  9. MySql命令——游标

    1.游标的概念 有时,需要在检索出来的行中前进或后退一行或多行.这就是使用游标的原因.游标(cursor)是一个存储在 MySql 服务器上的数据库查询,它不是一条 select 语句,而是被该语句检 ...

  10. jQuery中click()与trigger方法的区别

    click()可以执行单击事件,但是不可传参. $("button").click(function(){ alert("hello."); }); trigg ...