在中序线索二叉树中找前驱;指针
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 , 进行下一次的循环; } }