遍历二叉树

二叉树的遍历是指从根结点开始,按照某种次序依次访问二叉树中的所有结点,每个结点只能被访问一次。
遍历的意义在于 把树中的结点变成某种有意义的线性序列

前序遍历:

算法思想:
二叉树为空,则操作返回
不为空,则
       • 访问结点数据,并打印出来
         先序遍历左子树
         后序遍历右子树

实现代码:
void pre_order_travelse(btree_node* root)
{
 if(root != NULL)
 {
  printf("%c-", ((struct node*)root)->v);
  pre_order_travelse(root->left);
  pre_order_travelse(root->right);
 }
}
遍历效果:




中序遍历:

算法思想:
二叉树为空,则操作返回
不为空,则
          先序遍历左子树
       • 再访问结点数据,并打印出来
         后序遍历右子树
实现代码:
void mid_order_travelse(btree_node* root)
{
 if(root != NULL)
 {
  mid_order_travelse(root->left);
 
  printf("%c-", ((struct node*)root)->v);
 
  mid_order_travelse(root->right);
 }
}
遍历效果:



后序遍历:

算法思想:
二叉树为空,则操作返回
不为空,则
          先序遍历左子树
        后序遍历右子树
       • 最后访问结点数据,并打印出来

实现代码:
void post_order_travelse(btree_node* root)
{
 if(root != NULL)
 {
  post_order_travelse(root->left);
 
  post_order_travelse(root->right);
 
  printf("%c-", ((struct node*)root)->v);
 
 
 }
}
遍历效果:



层序遍历:

算法思想:
巧妙地利用了队列 FIFO 的思想
    • 访问根结点的数据
    • 访问第二层所有结点的数据
    • 访问第三层所有结点的数据
...

实现代码:
void level_order_travelse(btree_node* root)
{
 
 if(root != NULL)
 {
  LinkQueue* queue = LinkQueue_Create();
 
  if(queue != NULL)
  {
   
   LinkQueue_Append(queue, root);
   
   while( LinkQueue_Length(queue) > 0)
   {
    struct node* node = (struct node*)LinkQueue_Retrieve(queue);
   
    printf("%c, ", node->v);
   
    LinkQueue_Append(queue, node->header.left);
    LinkQueue_Append(queue, node->header.right);
   
   }
 
  }
 
  LinkQueue_Destroy(queue);
 }

}
遍历效果:



拓展:
关于队列在遍历中的使用还会用到,譬如图的广度优先遍历(BFS)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值