中序線索二叉樹的操做;

在中序線索二叉樹中找前驅;指針

BiTNode* Inpre(BiTree *p  , BiTNode *pre)
 {
       BiTNode *q;
      if(p->Ltag==1)
      pre=p->Lchild     // 空的左孩子指針指向,結點前驅 1 表示前驅存在;
      // 當該節點爲孩子結點時,
      //返回以p爲根的lDR 即爲最右下端的結點;

      else   
      {
          for(q=p->Lchild ; Q->Rtag==0 ; q=q->Rchild)
          pre=q;
      }
      return (pre);
 }

在中序線索二叉樹中找後繼;code

BiTNode* InNext(BiTree *p  , BiTNode *Next)
 {
       BiTNode *q;
      if(p->Rtag==1)
      Next=p->Rchild     // 空的左孩子指針指向,結點前驅 1 表示前驅存在;
      else   
      {
          // 在p右 子樹中查找最左下端;
          if(Rchild!=NULL) {
          for(q=p->Rchild ; Q->tag==0 ; q=q->Lchild) //爲孩子時就一直向q->Lchild 找;
          Next=q;
          }
          else 
          Next=NULL;
      }
  return (Next);

}
遍歷中序線索二叉樹
(1)在中序線索二叉樹求中序遍歷的第一個結點;it

BiTrNode* InFirst (BiTree *bt)
     {
           BiTrNode *p=bt;
          if(!p) return NULL;  //空二叉樹;
          while(p->Ltag==0)  // 中序訪問LDR 
          p=p->Lchild;
          return p;
 }

(2) 遍歷中序二叉樹,經過調用InFirst 和InNext能夠實現對中序二叉樹的遍歷,且不需要使用棧;二叉樹

void TInorder(BiTree Bt)
 {
   BiTNode *p;
   p=InFirst(Bt)  //找到首結點;
   while(p)
   {
        visit(p)    //拜訪p
       p=InNext(p);  //對每一個結點找他的後繼 ,並將找到的後繼結點賦給p , 進行下一次的循環;
   }
 }
相關文章
相關標籤/搜索