从上往下打印二叉树

【题目】

从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如:

这里写图片描述

打印结果:8,6,10,5,7,9,11。


【分析】

二叉树遍历方式:前序,中序,后序,还有一种广度优先遍历,在对图遍历时涉及到,而二叉树可以看作退化的图,从例子中可以看出,打印顺序是按层决定的,观察发现,打印完根节点之后,然后打印其左右节点,再继续打印左节点的左右孩子和右结点的左右孩子,由此可以发现,如果将其结点的左右孩子放在一个容器内,打印父节点后,再取其孩子依次打印,举上述例子进行说明:
1.打印8后,将6,10放在容器内;
2.打印6,将5,7放在容器内;
3.打印10,将9,11放入容器内;
4.打印5,5为叶子结点,没有左右孩子,故打印容器内下一个元素7,这样依次打印出9,11。

由上述可观察到,先进容器的先打印,先入先出的模式,而数据结构中队列就是这种模式,所以这个容器采用队列模式,但是和普通队列略有不同,要注意到队列的元素存储的是一个二叉树结点,存在左右孩子成员,所以这里最好用数组队列,当然,链表队列也是可以,但是指针方面相对复杂一点。

由此,总结思路如下所示:
1、根节点进入队列;
2、打印根节点,左右孩子进入队列;
3、循环第二步,直至队列中没有元素进入了。


【测试代码】

//从上往下打印二叉树(层序遍历,广度优先遍历)
#include<stdio.h>
#include<queue>
using namespace std;

struct BinaryTreeNode
{
    int m_nValue;
    BinaryTreeNode* m_pLef;
    BinaryTreeNode* m_pRight;
};

BinaryTreeNode* createBinaryTreeNode(int value)
{
    BinaryTreeNode* pNode = new BinaryTreeNode();
    pNode->m_nValue = value;
    pNode->m_pLef = NULL;
    pNode->m_pRight = NULL;
    return pNode;
}
void connectBinaryTreeNode(BinaryTreeNode* pParent, BinaryTreeNode* pLeftChild,
                           BinaryTreeNode* pRightChild)
{
    if(!pParent || !pLeftChild || !pRightChild)
        return;

    pParent->m_pLef = pLeftChild;
    pParent->m_pRight = pRightChild;
}

void printTreeFromTopToBottom(BinaryTreeNode* pRoot)
{
    if(pRoot == NULL)
        return;
    queue<BinaryTreeNode*> btnQueue;
    btnQueue.push(pRoot);
    while(!btnQueue.empty())
    {
        BinaryTreeNode* pTemp = btnQueue.front();
        btnQueue.pop();
        printf("%d ",pTemp->m_nValue);
        if(pTemp->m_pLef)
            btnQueue.push(pTemp->m_pLef);
        if(pTemp->m_pRight)
            btnQueue.push(pTemp->m_pRight);
    }
}
void test()
{
    BinaryTreeNode* pNode1 = createBinaryTreeNode(8);
    BinaryTreeNode* pNode2 = createBinaryTreeNode(6);
    BinaryTreeNode* pNode3 = createBinaryTreeNode(10);
    BinaryTreeNode* pNode4 = createBinaryTreeNode(5);
    BinaryTreeNode* pNode5 = createBinaryTreeNode(7);
    BinaryTreeNode* pNode6 = createBinaryTreeNode(9);
    BinaryTreeNode* pNode7 = createBinaryTreeNode(11);

    connectBinaryTreeNode(pNode1,pNode2,pNode3);
    connectBinaryTreeNode(pNode2,pNode4,pNode5);
    connectBinaryTreeNode(pNode3,pNode6,pNode7);

    printTreeFromTopToBottom(pNode1);
}
int main()
{
    test();
    return 0;
}

【输出】

这里写图片描述


【程序说明】

1.对于本题来说,如果纯用c来实现,将会耗费很大工作量,而考虑到现有编译器c和c++皆是兼容的,所以,不妨利用c++封装库的优势,在c++库中存在队列,在这里只需加上
#include<queue>
但这里需要注意,想要用c++库一定要加
using namespace std;
具体参照c++相关基础讲解,不再赘述。
2.queue库中相关应用解释:

queue<BinaryTreeNode*> btnQueue;

初始化队列,元素类型为BinaryTreeNode*,队列名btnQueue

btnQueue.push(pRoot)

将根节点压入队列

btnQueue.pop()

出队列

btnQueue.empty()

队列是否为空,可以理解为空为1,非空为0

btnQueue.front()

队列的头


【参考文档】
http://blog.csdn.net/walkerkalr/article/details/21109933?utm_source=tuicool

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值