二叉树的分层打印(二)

原创 2016年06月01日 21:40:44

在上一篇文章“二叉树的分层打印(一)”中,已经实现了二叉树的分层打印,本文讲述了其他的实现方式。

思路分析:
<1> 如果只是分层遍历二叉树并打印出所有元素,那么使用队列来实现BFS是最好的选择。
<2> 但是这里要求,每层元素打印为一行,所以我们必须知道每层元素的开始和结束是什么,这种情况下,使用数组或者STL中的vector容器是更好的选择,使用两个变量来标识每一层的开始和结束,控制每一层元素的访问。 这里我们使用vector来代替数组,可利用其动态扩展的属性。具体实现如下:

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


typedef struct node
{
    char data;
    struct node *lchild;
    struct node *rchild;
}BiNode, *BiTree;


// 先序建立二叉树 (输入时,按先序次序输入二叉树中结点的值,以 # 字符表示空树)
BiTree createBiTree()
{
    BiTree T;

    char c;
    scanf("%c", &c);

    if (c == '#')
        T = NULL;
    else
    {
        T = new BiNode;  // 或 T = (BiTree)malloc(sizeof(BiNode));
        T->data = c;

        T->lchild = createBiTree();
        T->rchild = createBiTree();
    }

    return T;

}


// 分层打印二叉树
void PrintTreeByLevel(BiTree T)
{
    if (NULL == T) return;

    vector<BiTree> vec;
    vec.push_back(T);

    int cur = 0; // 指向当前节点
    int last = 1; // 当前vec中节点的个数

    while(cur < vec.size())
    {
        last = (int)vec.size(); // 新的一层访问开始,last位于当前层最后一个节点的下一个位置(注意:last表示当前vec中节点的“个数”,是个数,不是下标)
        while (cur < last)
        {
            printf("%c ", vec[cur]->data);
            if (vec[cur]->lchild)
                vec.push_back(vec[cur]->lchild);

            if (vec[cur]->rchild)
                vec.push_back(vec[cur]->rchild);

            cur++;
        }
        //每一次循环都将下一层的节点压入vector,并且打印完本层节点。

        printf("\n"); // 当cur == last时,说明该层访问结束,输出换行符
    }
}


int main(int argc, const char * argv[]) {

    BiTree T = createBiTree(); // 建立

     PrintTreeByLevel(T); // 分层打印二叉树

    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

打印一棵二叉树,要求从上往下打印,每一层从左往右打印

思路:在二叉树的遍历中,用得最多的就是递归,二叉树的先序、中序、后序遍历都可以用递归实现,但是这里却要使用另外一种方式解决。利用队列先入先出的特性,我们先把二叉树每一层的节点按从左往右的顺序加入队列,...
  • zx582727090
  • zx582727090
  • 2016年08月02日 15:24
  • 617

分层打印二叉树--Java实现

前言啊:工作几年了,但以前大学学的算法都快忘完了。趁着准备换工作的时间准备把算法给捡起来,因为毕业后用的编程语言是Java所以准备都用Java语言来实现。 要求:有如下的二叉树,请写出一算法实现分层...
  • caonuoqi
  • caonuoqi
  • 2017年05月01日 15:12
  • 725

按层次方式打印二叉树

给定一个二叉树,以层次方式打印各层元素,如下。用到广度优先遍历。以广度优先,就是说一层层地打印,这样,先入的就先打印,所以用到的数据据结构是队列。而深度优先,则是先遍历完一个分支才进行第二个分支,用的...
  • tianyi1991
  • tianyi1991
  • 2015年07月28日 10:58
  • 948

从上往下分层打印二叉树

题目地址:http://ac.jobdu.com/problem.php?pid=1523题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。 输入: 输入可能包含多个测试样例,...
  • wusuopuBUPT
  • wusuopuBUPT
  • 2013年12月30日 13:32
  • 1577

打印二叉树的边界节点-代码指南

标准一: 打印边界节点 输入: {1,2,3,0,4,5,6,7,8,9,10,0,0,0,0,0,11,12,0,0,0,13,14,15,16} 输出: 1 2 4 7 11 13 1...
  • u010005161
  • u010005161
  • 2016年09月14日 11:16
  • 459

把二叉树打印成多行(java版)

【题目描述】从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。【解题思路】层序遍历二叉树,依次打印出每层节点,遇到空节点跳过。//非递归import java.util.ArrayLis...
  • ouyangyanlan
  • ouyangyanlan
  • 2017年06月06日 11:20
  • 1048

二叉树按层遍历打印的算法(c/c++)

void LevelOrder(BTree T, int cnt) { BTree level = malloc(sizeof(struct BTNode)*cnt); if(leve...
  • zhuisui8
  • zhuisui8
  • 2016年10月30日 16:15
  • 173

打印二叉树的边界节点

题目: 给定一颗二叉树的头结点head,按照如下标实现二叉树边节点的逆时针打印 标准一:     1、头节点为边界节点     2、叶结点为边界节点     3、如果节点在其所在的层中是最左...
  • u011068702
  • u011068702
  • 2016年08月08日 02:36
  • 1252

设计一个算法,按照层次打印这棵二叉树。

有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。...
  • zhangtian6691844
  • zhangtian6691844
  • 2016年08月21日 22:45
  • 866

二叉树按层遍历打印换行

我们都知道,广度优先遍历——对二叉树来说就是按层遍历,需要借助队列。代码也很简单,就几行。但是为什么要借助队列呢? 粗鲁分析: 二叉树的按层遍历是这样:从左到右,从上到下访问每个节点。 而二叉树本...
  • u010292561
  • u010292561
  • 2017年08月24日 10:18
  • 162
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树的分层打印(二)
举报原因:
原因补充:

(最多只允许输入30个字)