【二十二】遍历二叉树

1、简介
二叉树的遍历是指从根结点开始,按照某种次序依次访问二叉树中的所有结点。

通常有以下几种方式:

  • 前序遍历
  • 中序遍历
  • 后序遍历
  • 层次遍历

以上几种遍历方式,是根据在遍历时访问根结点中数据的顺序不同来命名的;

2、前序遍历

这里写图片描述

算法实现:

void pre_order_traversal(BTreeNode *root)
{
  if(root != NULL)
  {
    printf_Data(root);
    printf("\t");
    pre_order_traversal(root->left);
    pre_order_traversal(root->right);
  }
}

3、中序遍历

这里写图片描述

算法实现:

void printf_Data(BTreeNode *node)
{
  if(node != NULL)
  {
    printf("%c",((Node *)node)->v);
  }
}

void middle_order_traversal(BTreeNode *root)
{
  if(root != NULL)
  {
    middle_order_traversal(root->left);
    printf_Data(root);
    printf("\t");
    middle_order_traversal(root->right);
  }
}

4、后序遍历

这里写图片描述

算法实现:

void after_order_traversal(BTreeNode *root)
{
  if(root != NULL)
  {
    after_order_traversal(root->left);
    after_order_traversal(root->right);
    printf_Data(root);
    printf("\t");
  }
}

5、层次遍历

这里写图片描述

算法实现:
层次遍历的实现,可依赖队列,算法思路如下:

  1. 将根结点追加到队列中;
  2. 如果队列中元素个数大于0,将队首元素出队;
  3. 输出该节点中的数据;
  4. 分别将该结点的左结点和右结点追加到队列;
  5. 重复2-4,直到条件不满足;
void level_order_traversal(BTreeNode *root)
{
  if(root != NULL)
  {
    LinkQueue *queue = LinkQueue_Create();
    LinkQueue_Append(queue,root);
    while(LinkQueue_Length(queue) > 0)
    {
      BTreeNode *node = (BTreeNode*)LinkQueue_Retrieve(queue);
      printf_Data(node);
      printf("\t");

      LinkQueue_Append(queue,node->left);
      LinkQueue_Append(queue,node->right);
    }
    LinkQueue_Destroy(queue);
  }
}

6、完整源码下载

文件名:traversalbtree-1.0.tar.gz
链接: http://pan.baidu.com/s/1kTkXCqj 密码: gp88

编译步骤:
0.1 解压缩:tar -zxvf traversalbtree-1.0.tar.gz
0.2 进入目录:./configure
0.3 生成Seqlist:make
0.4 运行程序:./TraversalBtree

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值