题目:从上往下打印二叉树的每一个节点,同一层的节点按照从左到右的顺序打印

思路:这是一个层序遍历的问题,因此要借用到队列。我们可以在打印第一个节点的同时将这个节点的左右子节点都放入队列,同样打印左右子树。

抽象的问题具体化:

C++代码:

#include<iostream>
#include<deque>
using namespace std;
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
BinaryTreeNode* constructCore(int* preOrderStart,int* preOrderEnd,int* inOrderStart,int* inOrderEnd)
{
int value=*preOrderStart;
BinaryTreeNode* root=new BinaryTreeNode();
root->m_nValue=value;
root->m_pLeft=root->m_pRight=NULL;
//当只有一个节点时
if(preOrderStart==preOrderEnd)
{
if(inOrderStart==inOrderEnd&&*preOrderStart==*inOrderStart)
return root;
else
throw std::exception("inVaild input");
}
//当有多个节点的时候
int* rootInOrder=inOrderStart;
while(rootInOrder<inOrderEnd&&*rootInOrder!=value)
{
rootInOrder++;
}
if(rootInOrder==inOrderEnd&&*rootInOrder!=value)
throw std::exception("inVaild input"); int leftLength=rootInOrder-inOrderStart;
int rightLength=inOrderEnd-rootInOrder;
if(leftLength>)
root->m_pLeft=constructCore(preOrderStart+,preOrderStart+leftLength,inOrderStart,inOrderStart+leftLength-);
if(rightLength>)
root->m_pRight=constructCore(preOrderStart+leftLength+,preOrderEnd,inOrderStart+leftLength+,inOrderEnd);
return root;
}
BinaryTreeNode* construct(int * preOrder,int* inOrder,int length)
{
if(preOrder==NULL||inOrder==NULL||length<)
return NULL;
return constructCore(preOrder,preOrder+length-,inOrder,inOrder+length-);
}
void printNode(BinaryTreeNode* pNode)
{
if(pNode==NULL)
return;
cout<<"this node is: "<<pNode->m_nValue<<endl;
if(pNode->m_pLeft!=NULL)
cout<<"the left node is: "<<pNode->m_pLeft->m_nValue<<endl;
else
cout<<"the left node is NULL"<<endl;
if(pNode->m_pLeft!=NULL)
cout<<"the right node is: "<<pNode->m_pRight->m_nValue<<endl;
else
cout<<"the right node is NULL"<<endl;
}
void printBiTree(BinaryTreeNode* root)
{
if(root==NULL)
return;
printNode(root);
if(root->m_pLeft!=NULL)
printBiTree(root->m_pLeft);
if(root->m_pRight!=NULL)
printBiTree(root->m_pRight);
}
void main()
{
int a[]={,,};
int b[]={,,};
BinaryTreeNode* pHead=construct(a,b,);
printBiTree(pHead);
}

Java代码:

import java.util.LinkedList;
import java.util.Queue;
public class PrintFromTopToBottom { public static class BinaryTreeNode{
int m_nValue;
BinaryTreeNode m_pLeft;
BinaryTreeNode m_pRight; }
public static BinaryTreeNode CreateBiTree(int[] preorder,int start,int[] inorder,int end,int length){
if(preorder==null||inorder==null||preorder.length!=inorder.length||length<0)
return null;
BinaryTreeNode pRoot=new BinaryTreeNode();
int value=preorder[start];
pRoot.m_nValue=value;
pRoot.m_pLeft=pRoot.m_pRight=null;
//只有一个节点的时候
if(length==1){
if(preorder[start]==inorder[end])
return pRoot;
else
throw new RuntimeException("inVaild input!");
}
//有多个节点的时候
int i=0;
while(i<length){
if(value==inorder[end-i])
break;
i++;
}
if(i==length)
throw new RuntimeException("inVaild input!");
pRoot.m_pLeft=CreateBiTree(preorder,start+1,inorder,end-i-1,length-i-1);
pRoot.m_pRight=CreateBiTree(preorder,start+length-i,inorder,end,i);
return pRoot;
} public static void printFromTopToBottom(BinaryTreeNode pHead){
if(pHead==null)
return;
Queue<BinaryTreeNode> queue=new LinkedList<BinaryTreeNode>();
queue.add(pHead);
while(!queue.isEmpty()){
BinaryTreeNode pNode=queue.poll(); System.out.println(pNode.m_nValue);
if(pNode.m_pLeft!=null)
queue.add(pNode.m_pLeft);
if(pNode.m_pRight!=null)
queue.add(pNode.m_pRight);
}
}
public static void main(String[] args)
{
int[] a={3,5,6};
int[] b={5,3,6};
BinaryTreeNode pHead=CreateBiTree(a,0,b,2,a.length);
printFromTopToBottom(pHead);
} }

剑指offer-第四章解决面试题的思路(从上往下打印二叉树)的更多相关文章

  1. 《剑指offer》第三十二题(分行从上到下打印二叉树)

    // 面试题32(二):分行从上到下打印二叉树 // 题目:从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层 // 打印到一行. #include <cstdio> #in ...

  2. 剑指offer第四章

    剑指offer第四章 1.二叉树的镜像 二叉树的镜像:输入一个二叉树,输出它的镜像 分析:求树的镜像过程其实就是在遍历树的同时,交换非叶结点的左右子结点. 求镜像的过程:先前序遍历这棵树的每个结点,如 ...

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

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

  4. 剑指offer-第四章解决面试题的思路(栈的压入和弹出序列)

    题目:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为弹出序列. 思路:定义两个指针sPush和sPop分别指向两个整数序列的开头,借助一个辅助的栈,将第一个序列的数据依次压入栈中 ...

  5. 剑指offer-第四章解决面试题的思路(包含min函数的栈)

    题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,push及pop的时间复杂度都是O(1) 思路:定义两个栈分别为dataStack和minStack ...

  6. 剑指offer-第四章解决面试题的思路(顺序打印矩阵)

    题目:输入一个矩阵,按照从外向里的顺序依次打印出每一个数.(画图让抽象的问题形象化) 思路:打印矩阵时,把每一层当做一个圈来打印,找到打印整个矩阵的截止条件. 从上图中我可以看到一个6*6的矩阵(长宽 ...

  7. 剑指offer-第四章解决面试题的思路(二叉树的镜像)

    题目:请完成函数,输入一个二叉树,该函数输出它的镜像. 思路:可能没有听说过书的镜像,但是可以通过画图等来找灵感.就像照镜子一样,人的左边和右边交换了. 如图: 通过如下图变化就可以由左图得到右图: ...

  8. 剑指Offer面试题:21.从上到下打印二叉树

    一.题目:从上到下打印二叉树 题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印.例如输入下图中的二叉树,则依次打印出8.6.10.5.7.9.11. 二叉树节点的定义如下,采用 ...

  9. (剑指Offer)面试题23:从上到下打印二叉树

    题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 很明显,这是一个广度优先遍历. 需要一个队列容器来保存结点,具体操作: 1.将根结点压入队列中,并打印根结点:如果根结点有子结点 ...

随机推荐

  1. Apache 防盗链配置

    盗链 网站内有许多的图片地址,或一些我们可以用到的资源,在这种情况下,我可以通过赋值其他图片链接地址,到我自己的平台上,这样相当于盗取了一张图片的链接,那么盗链会有什么危害呢? 当我们盗取一张图片链接 ...

  2. jQuery时间轴鼠标悬停动画

    在线演示 本地下载

  3. 20165114 《网络对抗技术》 Exp0 Kali安装与配置 Week1

    目录: 一.kail的下载与安装 二.kali的网络设置 三.安装vmware-tools. 四.更新软件源. 五.共享文件夹 六.安装中文输入法 一.kail的下载与安装 VMware workst ...

  4. 20145109 《Java程序设计》第七周学习总结

    20145109 <Java程序设计>第七周学习总结 Chapter 13 Time & Date Date System.currentTimeMillis() return L ...

  5. Linux之Shell 脚本加密工具-shc

    Much effort, much prosperity. 为什么要加密Shell脚本呢?当然是为了安全! 可能脚本里面涉及到密码之类的就需要进行加密了 一.下载安装shc工具 要保护自己编写的she ...

  6. mysql全库搜索指定字符串

    mysql全库搜索指定字符串 DELIMITER // DROP PROCEDURE IF EXISTS `proc_FindStrInAllDataBase`; # CALL `proc_FindS ...

  7. 初入spring boot(五 )websocket

    一.广播式 广播式即服务端有消息时,会将消息发送给所有连接了当前endpoint的浏览器 1.配置websocket,需要在配置类上使用@EnableWebSocketMessageBroker开启w ...

  8. Android中获取并设置屏幕亮度

    最近在做一个Demo的时候用到了调节屏幕亮度的功能,于是上网搜索了一下,并且写了一个小Demo测试了一下,发现代码还是比较简单的.Android中的亮度调节,主要有三个方向,一个是针对于系统的亮度调节 ...

  9. org.apache.log4j.Logger用法

    在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作:跟踪代码运行时轨迹,作为日后审计的依据:担当集成开发环境中的调试器的作用,向文 ...

  10. rabbitmq High Availability

    每个rabbitmq node运行RabbitMQ application,共享用户virtual hosts, queues, exchanges, etc. 一个nodes组称之为一个集群. 所有 ...