在中序線索二叉樹中找前驅;指針
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 , 進行下一次的循環; } }