二叉树采用三叉链表的存储结构,不借助栈的非递归中序遍历

/**********
【题目】二叉树采用三叉链表的存储结构,试编写
不借助栈的非递归中序遍历算法。
三叉链表类型定义:
typedef struct TriTNode {
  TElemType data;
  struct TriTNode  *parent, *lchild, *rchild;
} TriTNode, *TriTree;
**********/
void InOrder(TriTree PT, void (*visit)(TElemType))
/* 不使用栈,非递归中序遍历二叉树PT,  */
/* 对每个结点的元素域data调用函数visit */
{
  TriTree p=PT, pr;  
  while(p)  
  {  
    if (p->lchild) 
      p = p->lchild;     //寻找最左下结点
    else {  
      visit(p->data);   //找到最左下结点并访问
      if (p->rchild) {  
        p =p->rchild;      //若有右子树,转到该子树,继续寻找最左下结点
      }  
      else {  
        pr = p;    //否则返回其父亲
        p = p->parent;  
        while (p && (p->lchild != pr ||!p->rchild)) {  //若其不是从左子树回溯来的,或左结点的父亲并没有右孩子
          if (p->lchild == pr)  //若最左结点的父亲并没有右孩子        
            visit(p->data);   //直接访问父亲(不用转到右孩子)             
          pr = p;  //父亲已被访问,故返回上一级
          p = p->parent;  //该while循环沿双亲链一直查找,若无右孩子则访问,直至找到第一个有右孩子的结点为止(但不访问该结点,留给下步if语句访问)
        }  
        if (p) {   //访问父亲,并转到右孩子(经上步while处理,可以确定此时p有右孩子)
          visit(p->data);
          p = p->rchild;  
        }  
      }  
    }  
   }
}




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值