zoukankan      html  css  js  c++  java
  • 面试题_分层遍历二叉树

    编程之美上的题目。

    问题1:给定一棵二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一行将单输出一行),每一层要求访问的顺序为从左向右,并将节点依次编号。

    问题2:写一个函数,打印二叉树中某层次的节点(从左向右),其中根结点为第1层。

    #include<iostream>
    #include
    <queue>
    using namespace std;

    struct Tnode
    {
    Tnode
    * leftChild;
    Tnode
    * rightChild;
    int value;
    Tnode():leftChild(NULL),rightChild(NULL)
    {
    value
    =0;
    }
    Tnode(
    int i):leftChild(NULL),rightChild(NULL)
    {
    value
    =i;
    }
    };
    //代码之美上的。输出第level层的所有元素
    void printNodeAtLevel(Tnode * root, int level)
    {
    if(root==NULL||level<0)
    {
    return ;
    }
    if(level==1)
    {
    cout
    <<root->value<<" ";
    return ;
    }
    printNodeAtLevel(root
    ->leftChild,level-1);
    printNodeAtLevel(root
    ->rightChild,level-1);
    }

    int main()
    {
    //建树
    Tnode * node1=new Tnode(1);
    Tnode
    * node2= new Tnode(2);
    Tnode
    * node3= new Tnode(3);
    Tnode
    * node4= new Tnode(4);
    Tnode
    * node5= new Tnode(5);
    Tnode
    * node6= new Tnode(6);
    Tnode
    * node7= new Tnode(7);
    Tnode
    * node8= new Tnode(8);
    node1
    ->leftChild=node2;
    node1
    ->rightChild=node3;
    node2
    ->leftChild=node4;
    node2
    ->rightChild=node5;
    node3
    ->rightChild=node6;
    node5
    ->leftChild=node7;
    node5
    ->rightChild=node8;

    //按层序遍历二叉树,并在每一层所有元素的后面打印一个换行符
    //编程之美上写的是类似递归的思想,其实也是在用递归栈来记录层数,
    //那么不如自己用个队列来实时追踪当前元素所在层
    queue<Tnode*> que;
    queue
    <int> level;//用一个辅助队列记录当前元素的所在层
    que.push(node1);
    level.push(
    1);
    int currentLevel=1;
    while(!que.empty())
    {
    Tnode
    * temp=que.front();
    que.pop();
    int l=level.front();
    level.pop();
    if(currentLevel<l)
    {
    cout
    <<endl;
    currentLevel
    =l;
    }
    cout
    <<temp->value<<" ";
    if(temp->leftChild!=NULL)
    {
    que.push(temp
    ->leftChild);
    level.push(l
    +1);
    }
    if(temp->rightChild!=NULL)
    {
    que.push(temp
    ->rightChild);
    level.push(l
    +1);
    }
    }
    cout
    <<endl;
    // printNodeAtLevel(node1,3);
    return 0;
    }
  • 相关阅读:
    为什么说 Java 程序员必须掌握 Spring Boot ?(转)
    Vert.x 之 HelloWorld
    Vert.x Web 文档手册
    Vert.x Core 文档手册
    Android数据存储五种方式总结
    设置简单的定时
    自定义dialog
    Android DrawerLayout 高仿QQ5.2双向侧滑菜单
    Fragments碎片
    理解Fragment生命周期
  • 原文地址:https://www.cnblogs.com/coser/p/2001592.html
Copyright © 2011-2022 走看看