求:一棵完全二叉樹中兩個結點u和v是否具有祖先後代關係?
分析:
樹的深度由根所在層從0開始,例如結點a的深度為0,結點c的深度為2。樹總的深度為d。
解:
方法一:對節點進行二進位制編碼。若u結點是v結點的祖先,則v結點則必遺傳u結點的標識。定義結點u的標識為其右邊第乙個非零位的左邊所有位。例圖中結點b的二進位制為「0000 0100」,右邊第乙個為0的是第三位,則結點u的標識「0000 0」。
(1) 對完全二叉樹按照中序遍歷進行編碼(從1開始),編碼二進位制如圖所示(高四位全為0,省略)。
(2) 遍歷樹可得結點u、v的編碼cu、cv以及他們的深度lu、lv;
(3) 假設lu
v,則lv肯定不是lu的祖先。將cu右移d - lu+1位可得其標識位fu,同樣將cv右移d – lv+1位得到cv』,若fu = cv』,則結點u為v的祖先;否則不是。
方法二:
(1) 非遞迴遍歷樹,中間結點儲存在棧中;
(2) 當u(或v)需要進棧時:若v(或u)在棧中,則v(u)是u(v)的祖先;若不在且v(或u)未被訪問,則接著遍歷,若已經訪問,則可判定結點u和v不存在祖先後代關係。
方法三:
(1) 對樹按先序排序,則a,b,c,d,e,f,g,h,i,j,k,l,m,o的編碼分別為1,2,3,4,5,6,7,8, 9,10,11,12,13,14;
(2) 將結點的所有祖先與它的排序作為它的編碼。例:結點b的編碼1.2,結點j的編碼1.9.10;
(3) 若u(或v)的排名出現在v(或u)的編碼中,則u(或v)是v(或u)的祖先;否則不具有祖先後代關係。
歡迎指正以及提出不同方法。
完全二叉樹結點數
222.完全二叉樹的節點個數 給你一棵完全二叉樹的根節點 root 求出該樹的節點個數。完全二叉樹的定義如下 在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1 2h 個節點。示例 輸入 ro...
ACM A 二叉樹結點公共祖先
乙個順序儲存的完全二叉樹 1 2 3 4 5 6 7 任意給定兩結點的編號,求兩結點最近的公共祖先。每組資料一行,為空格隔開的兩個數i和j,皆為32位有符號正整數 每組資料對應一行,為編號為i和j的結點的最近公共祖先的編號 4 5 4 7 2 1程式設計的時候注意考慮所有情況,要不可能一直在迴圈裡導...
1758 二叉樹 結點關係
描述 如上圖所示,由正整數1,2,3,組成了一棵無限大的二叉樹。從某乙個結點到根結點 編號是1的結點 都有一條唯一的路徑,比如從10到根結點的路徑是 10,5,2,1 從4到根結點的路徑是 4,2,1 從根結點1到根結點的路徑上只包含乙個結點1,因此路徑就是 1 對於兩個結點x和y,假設他們到根結點...