从上往下打印二叉树——23

   从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如如下二叉树打印出的结果为1、2、3、4、5、6、7、8、9。

wKioL1c8J7SxEeWMAAAdonuXRV4682.png

    上面所说的也就是二叉树的层序遍历,对于层序遍历来说,首先访问的肯定是根节点,然后是其左右结点,之后就是左子树的左右结点和右子树的左右结点,依次往下,如果使用像前中后序遍历那样按照左右结点去递归打印的话肯定是不行的,因为并不能一直先访问某个左结点或者右结点,而是应该左右交叉访问;

    上面的二叉树中,打印的顺序是1、2、3、4、5、6、7、8、9,可以想到按照队列的方式依次将其放入其中,而先进先出,得到的也就是打印的顺序,至于如何存放,可以先将根结点放入其中,拿到队首结点,如果队首结点的左右结点不为NULL,就依次放入队列中,然后将队首元素pop出,再循环取队首元素进行判断放入......直至遍历完二叉树且队列为空为止;


程序设计如下:

#include <iostream>#include <assert.h>#include <queue>using namespace std;struct BinaryTreeNode//二叉树结点结构体{    int _val;    BinaryTreeNode *_Lnode;    BinaryTreeNode *_Rnode;    BinaryTreeNode(int val)//构造函数        :_val(val)         ,_Lnode(NULL)         ,_Rnode(NULL)    {}};BinaryTreeNode* _Create(int *arr, size_t& index, size_t size)//前序方式创建二叉树{    if((index < size) && (arr[index] != '#'))    {        BinaryTreeNode *root = new BinaryTreeNode(arr[index]);        root->_Lnode = _Create(arr, ++index, size);        root->_Rnode = _Create(arr, ++index, size);        return root;    }    else        return NULL;}BinaryTreeNode* CreateBinaryTree(int *arr, size_t size){    assert(arr && size);    size_t index = 0;    return _Create(arr, index, size);}void DestoryBinaryTree(BinaryTreeNode* root)//销毁二叉树{    if(root != NULL)    {        DestoryBinaryTree(root->_Lnode);        DestoryBinaryTree(root->_Rnode);        delete root;        root = NULL;    }}void LevelOrderBinaryTree(BinaryTreeNode *root)//层序遍历二叉树{    assert(root);    queue<BinaryTreeNode*> q;    q.push(root);    while(!q.empty())    {        if(q.front()->_Lnode != NULL)            q.push(q.front()->_Lnode);        if(q.front()->_Rnode != NULL)            q.push(q.front()->_Rnode);        cout<<q.front()->_val<<" ";        q.pop();    }    cout<<endl;}void PrevOrder(BinaryTreeNode* root)//前序遍历二叉树,为了观察二叉树是否创建好{    if(root != NULL)    {        cout<<root->_val<<" ";        PrevOrder(root->_Lnode);        PrevOrder(root->_Rnode);    }}int main(){    int arr[] = {1,2,4,'#','#',5,8,'#','#','#',3,6,'#','#',7,'#',9,'#','#'};    BinaryTreeNode *root = CreateBinaryTree(arr, sizeof(arr)/sizeof(arr[0]));    cout<<"PrevOrder: ";    PrevOrder(root);    cout<<endl;    cout<<"LevelOrder: ";    LevelOrderBinaryTree(root);    DestoryBinaryTree(root);    return 0;}


运行程序:

wKioL1dERdWT2elwAAAGK5dHTyw570.png



《完》


本文出自 “敲完代码好睡觉zzz” 博客,请务必保留此出处http://2627lounuo.blog.51cto.com/10696599/1782663

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值