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、若是父母的右孩子,且父母無左子樹,則前驅是父母;
  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