求解二叉查詢樹中的最低公共祖先結點

2021-09-22 09:30:57 字數 2195 閱讀 5885

一,問題描述

請構造一棵二叉查詢樹,並給定兩個結點,請找出這兩個結點的最低公共祖先結點。

這裡假設二叉查詢樹中的結點的權值儲存是整型數字(見**中的binarynode內部類),最低公共祖先結點如下:結點5 和 結點12 的最低公共祖先結點是結點10

二,實現思路

假設給定的兩個結點的權值分別為 node1 和 node2

如果根的權值處於 node1 和 node2 之間,則根就是它們的最低公共祖先結點

如果根的權值比 node1 和 node2 都大,則它們的最低公共祖先結點在根的左子樹中

如果根的權值比 node1 和 node2 都小,則它們的最低公共祖先結點在根的右子樹中

因此,這可以用遞迴來實現。

三,**實現

首先得構造一棵二叉查詢樹。具體構造可參考:二叉樹的構造

構造好之後,呼叫lowestcommonparentnode方法即可找出最低公共祖先結點的權值。

public

class lowcommonnode

}private binarynode root;

private

void buildtree(int arr)

}private

void insert(int ele)

private binarynode insert(binarynode root, int ele)

/*** 求解二叉查詢樹中 node1 和 node2 代表的節點的 最低公共祖先結點

* 首先讓node1總是代表權值較小的那個結點.

* 對於二叉查詢樹而言:

* 如果根的權值處於 node1 和 node2 之間,則根就是它們的最低公共祖先結點

* 如果根的權值比 node1 和 node2 都大,則它們的最低公共祖先結點在根的左子樹中

* 如果根的權值比 node1 和 node2 都小,則它們的最低公共祖先結點在根的右子樹中

*/public

int lowestcommonparentnode(binarynode root, int node1, int node2)

assert node1 < node2;

if(root == null)

throw

new illegalargumentexception(" neither node1 nor node2 contains in binary search tree ");

if(root.ele > node1 && root.ele < node2)

return root.ele;

if(root.ele > node1 && root.ele > node2)//

if(root.ele > node2)

//在左子樹中查詢最低公共祖先結點

return lowestcommonparentnode(root.left, node1, node2);

else

< node1

//在右子樹中查詢最低公共祖先結點

return lowestcommonparentnode(root.right, node1, node2);}//

hapjin test

public

static

void main(string args) ;

lcn.buildtree(arr);//

build a binary search tree

//node1 and node2 should exist in arr,or will throw illegalargumentexception

int node1 = 5;

int node2 = 12;

//should build tree before invoke lowestcommonparentnode

system.out.println(lcn.lowestcommonparentnode(lcn.root, node1, node2));}}

四,參考資料求解二叉樹中兩個結點的最低公共父結點

二叉樹的構造

235 二叉樹最低公共祖先

給定乙個二叉搜尋樹,找到該樹中兩個指定節點的最近公共祖先。最近公共祖先的定義為 對於有根樹 t 的兩個結點 p q,最近公共祖先表示為乙個結點 x,滿足 x 是 p q 的祖先且 x 的深度盡可能大 乙個節點也可以是它自己的祖先 例如,給定如下二叉搜尋樹 root 6,2,8,0,4,7,9,nul...

二叉排序樹的最低公共祖先

接著上面一篇文章。那麼如果該二叉樹是bst呢?可以利用bst的性質。這題也假設這兩個節點同時存在。從根結點出發,沿著兩個給定結點的公共祖先前進。當這兩個結點的值同時小於當前結點的值時,沿當前結點的左指標前進 當這兩個結點的值同時大於當前結點的 值時,沿當前結點的右指標前進 當第一次遇到當前結點的值介...

二叉樹中兩節點的最低公共祖先

二叉樹中兩節點的最低公共祖先 要求如下 給定乙個頭節點head 和另外兩個節點 a b 返回 a 和 b 的最低公共祖先 和思路如下 package beginner.tree 給定乙個頭節點head 和另外兩個節點 a b 返回 a 和 b 的最低公共祖先 auther 蘇察哈爾丶燦 date 2...