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

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

抽象的问题具体化:

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. 禁止电脑登陆QQ聊天系统的四种方法

    一.使用防火墙禁止端口法 QQ使用的默认端口是 UDP 4000,使用防火墙将该端口关闭,那么别人就不能使用QQ了,当自己需要上网时只需开放该端口就可以了. 下面以我使用的“金山网镖6”进行说明,点击 ...

  2. SpringBoot 通用Error设计

    在项目中需要设计统一的错误消息,通常使用枚举类定义"错误码"与"错误消息": 并且也可以做错误消息自定义. 定义通过错误接口类:CommonError publ ...

  3. 【Java并发】Java中的原子操作类

    综述 JDK从1.5开始提供了java.util.concurrent.atomic包. 通过包中的原子操作类能够线程安全地更新一个变量. 包含4种类型的原子更新方式:基本类型.数组.引用.对象中字段 ...

  4. PAT1051. Pop Sequence (25)

    #include <iostream> #include <stack> using namespace std; int sizeMax,n,k; stack<int& ...

  5. c++ learning

    迟到了三年的学习笔记.. 野指针:造了一个指针,不是NULL或者没有指向正经内存.比如刚造出来又不赋值,并不知道它指向了哪里 内存泄漏:造了一个指针,给他分配了空间,xxxxx,又分配了一块空间,指针 ...

  6. VLAN虚拟局域网技术(一)-计算机网络

    本文主要知识来源于学校课程,部分知识来自于H3C公司教材,未经许可,禁止转载.如需转载,请联系作者并注明出处. 1.  VLAN(Virtual LAN):我们称之为虚拟局域网,它的作用就是将物理上互 ...

  7. Hibernate -- 检索方式 HQL

    Hibernate 提供了以下几种检索对象的方式 导航对象图检索方式:  根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的OID 来检索对象 HQL 检索方式:使用面向对象的HQL查询 ...

  8. bzoj 3884 上帝与集合的正确用法 指数循环节

    3884: 上帝与集合的正确用法 Time Limit: 5 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description   根据一些 ...

  9. gitlab库迁移

    gitlab 迁移 gitlab上一共有两个分之,一级提交记录. git clone --bare http://111.222.333.xxx/jiqing/test.git 执行成功后,会多一个t ...

  10. 使用mybatis报错constructor found in com.atguigu.mybatis.bean.Department matching [java.lang.Integer, java.lang.String]

    报错constructor found in com.atguigu.mybatis.bean.Department matching [java.lang.Integer, java.lang.St ...