二叉樹遍歷的前驅和後繼

2021-07-07 04:35:56 字數 2294 閱讀 5253

下面關於二叉樹三種遍歷方法的前驅和後繼作討論和總結。一、前序遍歷1.1 找後繼:  

(1)若有左子女,則後繼是左子女;

(2)若無左子女,有右子女,則後繼是右子女;

(3)若既無左子女,又無右子女,則是一片葉子:

a.若是其父母的左子女,且父母有右子女,則後繼是父母的右子女。

b.若是其父母的左子女,且父母無右子女;

c.若是其父母的右子女。

b、c都表示這是某個節點的左子樹前序遍歷的最後乙個節點,則需要找第乙個有右子樹的「左祖先」(即找第乙個使得當前節點在這個祖先的左子樹上),然後後繼就是這個祖先的右子女。

如何找這個左祖先?即

while( (p->parent->rchild==null||p->parent->rchild==p) && p!=null )

p=p->parent;

if(!p)表示已經全部遍歷完畢。結束;else p=p->lchild;下乙個節點

1.2 找前驅

(1)若是父母的左孩子,則前驅是父母;

(2)若是父母的右孩子,且父母無左子樹,則前驅是父母;

(3)若是父母的右孩子,父母有左子樹,則前驅是父母左子樹的最後訪問到的節點(指向父母的左子樹後,一直往右,若不行的話,往左一步,一直到葉子)二、中序遍歷2.1 找後繼

(1)如有右子女,後繼是右子女的最左下節點;

(2)若無右子女,且是父母的左子女,則後繼就是父母;

(3)若無右子女,且是父母的右子女,則一直上溯到第乙個「左祖先」(定義如前面)則後繼就是這個祖先。若無這樣的祖先,說明已經遍歷完畢。

2.2 找前驅

(1)如有左子女,前驅是左子女的最右下節點;

(2)若無左子女,且是父母的右子女,則前驅就是父母;

(3)若無左子女,且是父母的左子女,則一直上溯到第乙個「右祖先」(定義如前面)則前驅就是這個祖先。若無這樣的祖先,說明已經遍歷完畢。

三、後序遍歷

3.1 找後繼

(1)若是父母的右孩子,則後繼是父母;

(2)若是父母的左孩子,且父母無右子樹,則後繼是父母;

(3)若是父母的左孩子,父母有右子樹,則後繼是父母右子樹的最先訪問到的節點(指向父母的右子樹後,一直往左,若不行的話,往右一步,一直到葉子)

3.2 找前驅:  

(1)若有右子女,則前驅是右子女;

(2)若無右子女,有左子女,則前驅是左子女;

(3)若既無左子女,又無右子女,則是一片葉子;再討論:

a.若是其父母的右子女,且父母有左子女,則前驅是父母的左子女。

b.若是其父母的右子女,且父母無左子女;

c.若是其父母的左子女。

b、c都表示這是某個節點的右子樹後序遍歷的第乙個節點,則需要找第乙個

有    左子樹的「右祖先」,然後前驅就是這個祖先的左子女。

其實前序遍歷是「左右根」,中序遍歷是「左根右」,後序是「左右根」,我們可以看出,前序找後繼和後序找前驅是對偶的(只要把左換成右,前驅換成後繼,第一訪換成最後訪問即可),同樣前序找前驅和後序找後繼,中序找前驅和中序找後繼都是對偶的,這樣記憶起來就非常方便了~~~~~

附上中序遍歷查詢前驅後後繼的**:

typedef

struct

_node node; 

//樹節點資料結構定義

typedef

node* tree;  

//查詢二叉查詢樹中關鍵字最小的節點,返回指向該節點的指標

tree tree_minimum(tree root)  

//查詢二叉查詢樹中關鍵字最大的節點,返回指向該節點的指標

tree tree_maxmum(tree root)  

return

p;  

}  //查詢二叉查詢樹中節點x的後繼節點,返回指向該節點的指標

//在查詢過程中,如果節點x右子樹不為空,那麼返回右子樹的最小節點即可

//如果節點x的右子樹為空,那麼後繼節點為x的某乙個祖先節點的父節點,而且該祖先節點是作為其父節點的左兒子

tree tree_successor(tree x)  

return

y;  

}  //查詢二叉查詢樹中節點x的前驅節點,返回指向該節點的指標

//在查詢過程中,如果節點x左子樹不為空,那麼返回左子樹的最大節點即可

//如果節點x的左子樹為空,那麼前驅節點為x的某乙個祖先節點的父節點,而且該祖先節點是作為其父節點的右兒子

tree tree_predecessor(tree x)  

return

y;  

}

樹和二叉樹4 前驅和後繼

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

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

建立線索的初衷就是為了在乙個結點中能夠更方便找到前驅結點和後繼結點。中序線索二叉樹 先序線索二叉樹 後序線索二叉樹 找到以p為跟的子樹中,第乙個被中序遍歷的結點 threadnode firstnode threadnode p 在中序線索二叉樹中找到結點p的後繼結點 threadnode next...

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

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