有了線索的二叉鏈表那么遍歷就方便多了,不需要借助棧也不需要用遞歸了,因?yàn)樗呀?jīng)把前驅(qū)后繼都連起來了,而不像二叉樹那樣,走不動(dòng)的時(shí)候就只能退棧了。 而且遍歷速度快。
算法思路:先找到中序下的第一結(jié)點(diǎn),訪問之;若被訪問的結(jié)點(diǎn)的右指針為線索指針,直接取其后繼結(jié)點(diǎn)訪問;……,直到被訪問結(jié)點(diǎn)的右子樹存在,再從相應(yīng)右子起找中序下的第一結(jié)點(diǎn),……,依次類推,直到整個(gè)樹遍歷完畢。
算法描述:
BTptr Tinorder(BTptr Thrt) //對(duì)中序線索二叉樹的遍歷//
{
BTptr p=T->lchild; //P 指向的是根結(jié)點(diǎn)
while(p!=Thrt) //循環(huán)鏈表沒有到頭結(jié)點(diǎn)
{
while(p->Ltag==Link) p=p->Lchild; //找到中序下的第一結(jié)點(diǎn)//
visit(p);
while(p->Rtag==Thread&&p->Rchild!=Thrt)//如果右指針指向的是后繼結(jié)點(diǎn)
{ p=p->Rchild; //那么就大膽的訪問吧,取p后繼結(jié)點(diǎn),訪問之//
visit(p);
}
p=p->Rchild; // 如果不是后繼結(jié)點(diǎn),那么還得按照中序遍歷的方法求得后繼//
}
}
在中序線索二叉樹中,每一非空的線索均指向其祖先結(jié)點(diǎn)。
在二叉樹上,對(duì)有左右子女的結(jié)點(diǎn),其中序前驅(qū)是其左子樹上按中序遍歷的最右邊的結(jié)點(diǎn)(該結(jié)點(diǎn)的后繼指針指向祖先),中序后繼是其右子樹上按中序遍歷的最左邊的結(jié)點(diǎn)(該結(jié)點(diǎn)的前驅(qū)指針指向祖先)。
非空二叉樹中序遍歷第一個(gè)結(jié)點(diǎn)無前驅(qū),最后一個(gè)結(jié)點(diǎn)無后繼,這兩個(gè)結(jié)點(diǎn)的前驅(qū)線索和后繼線索為空指針。
以上是小編為大家整理好的有關(guān)考研的資料,希望對(duì)大家有所幫助!如有疑問請(qǐng)關(guān)注應(yīng)屆畢業(yè)生網(wǎng)!