二叉樹遍歷的前驅和後繼規則說明
阿新 • • 發佈:2019-01-28
二叉樹遍歷的遞迴演算法和非遞迴演算法我們當然應該很熟悉了,不過還有另外一種遍 歷方式,就是增加了樹的構造,然後不允許遞迴或是用到棧進行遍歷,如線索樹或者是 有父母節點的二叉樹等等等等。這樣的遍歷就需要我們找到一個節點的後繼,同樣如果 有更變態的題要求我們找一個節點的前驅,也和找後繼是一個型別,下面我就關於三種 遍歷方法的前驅和後繼作一討論和總結,讓大家在考試的時候得心應手。也請高手給與 指正 一、前序遍歷 找後繼: 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、若是父母的右孩子,且父母無左子樹,則前驅是父母; 3、若是父母的右孩子,父母有左子樹,則前驅是父母左子樹的最後訪問到的節點 (指 向父母的左子樹後,一直往右,若不行的話,往左一步,一直到葉子) 二、中序遍歷 找後繼 1、如有右子女,後繼是右子女的最左下節點; 2、若無右子女,且是父母的左子女,則後繼就是父母; 3、若無右子女,且是父母的右子女,則一直上溯到第一個“左祖先”(定義如前 面)則 後繼就是這個祖先。若無這樣的祖先,說明已經遍歷完畢。 找前驅 1、如有左子女,前驅是左子女的最右下節點; 2、若無左子女,且是父母的右子女,則前驅就是父母; 3、若無左子女,且是父母的左子女,則一直上溯到第一個“右祖先”(定義如前 面)則 前驅就是這個祖先。若無這樣的祖先,說明已經遍歷完畢。 三、後序遍歷 找後繼 1、若是父母的右孩子,則後繼是父母; 2、若是父母的左孩子,且父母無右子樹,則後繼是父母; 3、若是父母的左孩子,父母有右子樹,則後繼是父母右子樹的最先訪問到的節點 (指 向父母的右子樹後,一直往左,若不行的話,往右一步,一直到葉子) 找前驅: 1、若有右子女,則前驅是右子女; 2、若無右子女,有左子女,則前驅是左子女; 3、若既無左子女,又無右子女,則是一片葉子;再討論: a若是其父母的右子女,且父母有左子女,則前驅是父母的左子女。 b若是其父母的右子女,且父母無左子女; c若是其父母的左子女。 b,c都表示這是某個節點的右子樹後序遍歷的第一個節點,則需要找第一個 有 左子樹的“右祖先”,然後前驅就是這個祖先的左子女。 其實前序遍歷是“左右根”,中序遍歷是“左根右”,後序是“左右根”,我們可 以看出,前序找後繼和後序找前驅是對偶的(只要把左換成右,前驅換成後繼,第一訪 問換成最後訪問即可),同樣前序找前驅和後序找後繼,中序找前驅和中序找後繼都是 對偶的,這樣記憶起來就非常方便了~~~~~ 轉自:http://bbs.sjtu.edu.cn/bbscon,board,Algorithm,file,M.1041171619.A.html