線索二叉樹(找前驅 後繼)

2022-06-11 21:54:10 字數 2012 閱讀 4701

建立線索的初衷就是為了在乙個結點中能夠更方便找到前驅結點和後繼結點。

中序線索二叉樹

先序線索二叉樹

後序線索二叉樹

//找到以p為跟的子樹中,第乙個被中序遍歷的結點

threadnode *firstnode(threadnode *p)

//在中序線索二叉樹中找到結點p的後繼結點

threadnode *nextnode(threadnode *p)

//對中序線索二叉樹進行中序遍歷,(利用線索實現的非遞迴演算法)

void inorder(threadnode *t)

空間複雜度

在中序線索二叉樹中找到指定結點*p的中序前驅pre

若p->ltag==1(被線索化了),則 pre=p->lchild(直接就是前驅)

若p->ltag==0(沒有被線索化), 必定是有左孩子的。

//找到以p為根的子樹中,最後乙個被中序遍歷的結點

threadnode *lastnode(threadnode *p)

//在中序線索二叉樹中找到結點p的前驅結點

threadnode *prenode(threadnode *p)

//對中序線索二叉樹進行逆向中序遍歷

void revinorder(threadnode *p)

在先序線索二叉樹中找到指定結點*p的先序後繼next

若p->rtag==1(被線索化了),則 next=p->rchild(直接就是前驅)

若p->rtag==0(沒有被線索化), 必定是有右孩子的。

}在先序線索二叉樹中找到指定結點*p的先序前驅pre

若p->ltag==1(被線索化了),則 pre=p->lchild(直接就是前驅)

若p->ltag==0(沒有被線索化), 必定是有左孩子的。

先序遍歷中,左右子樹中的結點只可能是根節點的後繼,不可能是前驅

如果能找到p的父節點,且p是左孩子

如果能找到p的父節點,且p是右孩子,其左兄弟為空

如果能找到p的父節點,且p是右孩子,其左兄弟非空

如果p是根節點,則p沒有先序前驅

先一直往右邊走,如果沒得走了,在往左邊走

後序線索二叉樹找後序前驅

在後序線索二叉樹中找到指定結點*p的後續前驅pre

若p->ltag==1,則pre=p->lchild

若p->ltag==0,必有左孩子

使用三叉鍊錶來實現

二叉樹遍歷的前驅和後繼

下面關於二叉樹三種遍歷方法的前驅和後繼作討論和總結。一 前序遍歷1.1 找後繼 若有左子女,則後繼是左子女 若無左子女,有右子女,則後繼是右子女 若既無左子女,又無右子女,則是一片葉子 若是其父母的左子女,且父母有右子女,則後繼是父母的右子女。若是其父母的左子女,且父母無右子女 若是其父母的右子女。...

樹和二叉樹4 前驅和後繼

二叉樹的幾何結構和遍歷路徑,是查詢前驅和後繼的基礎。幾何結構千變萬化,但單個結點必然和至多3點鄰接 左 或右 父,左子和右子。按照 x 型助記,交叉點為研究物件。為求結點n的前驅結點p和後繼結點s,設n的左子l,右子r和父f fl,f的左子,fr,f的右子 若n是f的左子,則f是n的右父 若n是f的...

找到二叉樹的後繼節點(或前驅節點)

找到二叉樹的前驅節點 在二叉樹的中序遍歷中,乙個節點的後繼結點就是他的下乙個節點 想要找到任意乙個節點的後繼結點,二叉樹的節點型別node需要包含父節點的資訊 節點 struct node include include 節點 struct node void insert tree node ro...