数据结构——二叉树之七种遍历

本篇主要来实现二叉树的遍历

1.递归实现

三种递归遍历的方式 本质上压栈顺序是相同的。 printf位置决定访问顺序。

(即遍历一次二叉树时,一个结点有三次访问的机会,printf的位置决定哪一次访问)

//先序遍历
void preOrderTraverase(TreeNode *t)
{
    if(t)
    {
        printf("%d",t->_data);
        preOrderTraverase(t->_left);
        preOrderTraverase(t->_right);
    }
}
//中序遍历
void midOrderTraverase(TreeNode *t)
{
    if(t)
    {
        midOrderTraverase(t->_left);
        printf("%d",t->_data);
        midOrderTraverase(t->_right);
    }
}
//后续遍历
void postOrderTraverase(TreeNode *t)
{
    if(t)
    {
        postOrderTraverase(t->_left);
        postOrderTraverase(t->_right);
        printf("%d",t->_data);
    }
}

2.循环实现

非递归的遍历 借用栈来实现。

先序和中序遍历,首先将root根节点入栈,一路向左,遇空pop,向右重生。

//先序
void preStackTree(TreeNode *r)
{
   if(r)
   {
       Stack s;
       initStack(&s,1000);
       printf("pretraverse Tree:  ");
       while(r || !isStackEmpty(&s))
       {
           while(r)
           {
               printf("%d",r->_data);
               push(&s,r);
               r = r->_left;
           }
           if(!isStackEmpty(&s))
           {
               r = pop(&s);
               r = r->_right;
           }
       }
       putchar(10);
   }

}
//中序
void midStackTree(TreeNode *r)
{
   if(r)
   {
       Stack s;
       initStack(&s,1000);
       printf("midtraverse Tree:  ");
       while(r || !isStackEmpty(&s))
       {
           while(r)
           {
               push(&s,r);
               r = r->_left;
           }
           if(!isStackEmpty(&s))
           {
               r = pop(&s);
               printf("%d",r->_data);
               r = r->_right;
           }
       }
       putchar(10);
   }

}

//****************************
//hou'xu后续遍历
void postStackTree(TreeNode *t)
{
   Stack s;
   initStack(&s,100);
   TreeNode *cur; //当前结点
   TreeNode *pre=NULL; //前一次访问的结点
   push(&s,t);
   while(!isStackEmpty(&s))
   {
       cur = pop(&s);
       push(&s,cur);
       if((cur->_left==NULL&&cur->_right==NULL)||
               (pre!=NULL&&(pre==cur->_left||pre==cur->_right)))
       {
           //如果当前结点没有孩子结点或者孩子节点都已被访问过
           printf("%d ",cur->_data);
           pop(&s);
           pre=cur;
       }
       else
       {
           if(cur->_right != NULL)
               push(&s,cur->_right);
           if(cur->_left != NULL)
               push(&s,cur->_left);
       }
   }
}

3.层序遍历

层序遍历借用队列,先进先出。

根节点入队,进入循环。结点出队,孩子入队,先左后右。

void LevelorderTraverse(TreeNode *t)
{
    Queue q;
    initQueue(&q);
    enQueue(&q,root);
    while(!isQueueEmpty(&q))
    {
        TreeNode * t = deQueue(&q);
        printf("%c\n",t->data);
        if(t->left)
            enQueue(&q,t->left);
        if(t->right)
            enQueue(&q,t->right);
    }
}

4.递归法求二叉树深度

递归,就是老母猪戴胸罩——一套又一套。(强行文学范?)

"老母猪戴胸罩——一套又一套"这一歇后语比喻讲话做事系统性很强,连贯而富有逻辑,引经据典,充满学识。也有说比喻做人不真诚,为了达到目的,使用一个又一个的套路。

 递归求深度的思想:把一棵大树left…left…分解到最小树,求最小数的深度,再选取深度较大值 一层一层的往上扩充。——灵魂解释……

int getHeightByPostOrder(TreeNode * t)
{
    int lH, rH, maxH;
    if(t)
    {
        lH = getHeightByPostOrder(t->_left);
        rH = getHeightByPostOrder(t->_right);
        maxH = (lH>rH)?lH:rH;
        return maxH +1;
    }
    else
        return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值