中序线索二叉树的操作;

在中序线索二叉树中找前驱;

 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);
 }

在中序线索二叉树中找后继;

 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)在中序线索二叉树求中序遍历的第一个结点;

     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 , 进行下一次的循环;
   }
 }

你可能感兴趣的:(二叉树,数据结构与算法,raspberry-pi)