要求考慮以下三種種情況,給出解決方案,並解決:
1:二叉樹是搜尋二叉樹。
2: 二叉樹每個節點有parent(三叉鏈)
treenode* publiclowparent(treenode *root, treenode*c1, treenode* c2)
else
if (c1->
data
< cur->
data
&&c2->
data
< cur->
data)
else
return cur;
}}
針對第二種情況
以前遇到過2個單鏈表相交求交點的問題,此時我們可以借鑑當時的鍊錶求交點的辦法,來尋找2個節點所在鍊錶的交點,即為公共最近公共祖先。鍊錶求交點,如果2個鍊錶長度不相等,要將長鍊錶縮短,直到與短鍊錶的長度相等為止。
int getlen(treenode *root,treenode* node)
return count;
}treenode* publiclowparent(treenode *root, treenode*c1,treenode* c2 )
}//p2比p1長,p2先走多餘的長度步
else
}//此時鍊錶長度一樣,一起向後走
while (p1 != p2)
//跳出迴圈時即為2鍊錶相交點
return p1;
}
對於第三種情況,我們借助棧來實現,儲存這2個節點從根結點開始到他們的路徑,根據棧中的資料來判斷最近的公共交點,同樣也用到了鍊錶的求交點的思想
//從根結點開始找尋節點,將路徑中的節點分別進行壓棧
bool getpath(treenode* root, treenode* node, stack
& s)
return
true;
}}treenode* publiclowparent(treenode *root, treenode*c1, treenode* c2)
}else
}while (!s1.empty() && !s2.empty() && s1.top() != s2.top())
return s1.top();
}
求二叉樹中兩個節點的最近公共祖先
比如 在如圖這棵二叉樹中,8和9的公共祖先是1,4和5的公共祖先是2,5和2的公共祖先是2。在上述分析中,我們可以得出思路,本題解法可分為兩種情況,1 兩個節點在根節點同側 則它們的最近公共祖先可能是其中乙個節點,也可能是在到兩個節點的公共路徑上。2 兩個節點在根節點的不同側,則它們的公共祖先只能是...
求二叉樹兩個節點的最近公共祖先
偶然看到乙個特別特別巧妙的方法,在此記錄一下 typedef struct xbnodexbnode,xbtree 取名叫xbtree是因為以為這個是線索二叉樹 記住!這個不是線索二叉樹,線索二叉樹是儲存了前驅和後繼的指標,包括前序線索二叉樹 中序線索二叉樹和後序線索二叉樹三種。由於建立的時候多了乙...
二叉樹中兩個節點的最近公共父節點
這個問題可以分為三種情況來考慮 情況一 root未知,但是每個節點都有parent指標 此時可以分別從兩個節點開始,沿著parent指標走向根節點,得到兩個鍊錶,然後求兩個鍊錶的第乙個公共節點,這個方法很簡單,不需要詳細解釋的。情況二 節點只有左 右指標,沒有parent指標,root已知 思路 有...