二叉树的分层打印(三)

原创 2016年06月02日 11:14:37

二叉树的分层打印,我们已经在“二叉树的分层打印(一)”“二叉树的分层打印(二)”中探讨过了,本文依然是探讨按层遍历二叉树,只是要求“从下往上”访问,并且每一层中结点的访问顺序为“从右向左”。
解决思路:只要层与层之间加入哑元素(NULL),然后逆序输出即可。
(即在每一层之间加一个标识来解决这个问题,此处使用NULL来分隔每一层)

具体实现如下:

#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 ReversePrintTreeByLevel(BiTree T)
{
    if (T == NULL) return;

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

    int index = 0;

    while (index < vec.size())
    {
        vec.push_back(NULL); // 在当前层的最后一个元素的后面插入哑元素;

        while (vec[index] != NULL) // 遍历当前层的元素,当遇到哑元素时跳出循环
        {
            if (vec[index]->lchild)
                vec.push_back(vec[index]->lchild);

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

            index++;
        }

        index++; // 跳过哑元素
    }


    for (int i = (int)vec.size() - 1; i >= 0; i--)
    {
        if (vec[i] == NULL)
            printf("\n");
        else
            printf("%c ", vec[i]->data);
    }

    printf("\n");
}

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

    BiTree T = createBiTree(); // 建立
    ReversePrintTreeByLevel(T);

    return 0;
}

补充:如果是要求“从下往上”访问,并且每一层中结点的访问顺序为“从左向右”,那么只需要改变上述 ReversePrintTreeByLevel 函数中左右孩子节点加入vector的顺序即可。

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

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

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

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

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

二叉树的层次遍历,从上到下和从下到上分层打印

用queue和vector都可以实现层次遍历
  • lzx_2011
  • lzx_2011
  • 2014年04月26日 22:07
  • 2377

按层次方式打印二叉树

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

从上往下分层打印二叉树

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

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

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

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

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

二叉树按层遍历打印换行

我们都知道,广度优先遍历——对二叉树来说就是按层遍历,需要借助队列。代码也很简单,就几行。但是为什么要借助队列呢? 粗鲁分析: 二叉树的按层遍历是这样:从左到右,从上到下访问每个节点。 而二叉树本...
  • u010292561
  • u010292561
  • 2017年08月24日 10:18
  • 161

分层打印二叉树

问题: 把一个二叉树,安装从root到leaf的顺序把每一层上的node从左到右打印出来。 分析: 利用两个arraylist,一个arraylist装上一层的node, 另一个arra...
  • beiyetengqing
  • beiyetengqing
  • 2012年06月04日 10:29
  • 721

二叉树的分层打印(二)

在上一篇文章“二叉树的分层打印(一)”中,已经实现了二叉树的分层打印,本文讲述了其他的实现方式。思路分析: 如果只是分层遍历二叉树并打印出所有元素,那么使用队列来实现BFS是最好的选择。 ...
  • cyuyanenen
  • cyuyanenen
  • 2016年06月01日 21:40
  • 253
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树的分层打印(三)
举报原因:
原因补充:

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