樹中兩個節點的最低公共父節點

2021-07-05 04:07:57 字數 1588 閱讀 6813

題目:給出兩個結點a和b,求解這兩個結點的最低公共祖先(lca)

條件(1)樹為二叉搜尋樹

思路:二叉搜尋樹指的是每個父節點有兩個子節點,並且節點的左子樹均小於節點值,右子樹上節點的值大於節點的值。

所以我們求兩個節點的最低公共父節點應滿足(父節點大於其中乙個節點且小於另外乙個。)如果此時搜尋的節點大於這兩個節點,則最低父節點應在該節點的左子樹中,相反的,此時搜尋的節點小於這兩個節點,則最低父節點應在該節點的右子樹中。具體節點定義和實現方法如下:

struct treenode

;treenode* findnearestfather(treenode* root,treenode* node1,treenode* node2)

return null;

}

條件(2)一般的二叉樹 + 有指向父親的指標

一般的二叉樹,大小沒有規律,但是有指向父節點的指標,這就好辦多了,相當於每個節點多了乙個指向父節點的屬性。我們可以從兩個節點往回搜尋,找到到根節點的兩條路徑,最後只要找這兩條路徑的第乙個公共節點即可。和找兩鍊錶的第乙個公共節點相同的處理辦法。樹節點定義和演算法實現如下:

struct treenode1

;int countlen(treenode1 *root)

return len;

}treenode1* findnearestfather1(treenode1* root,treenode1* node1,treenode1* node2)

} else if(length1father;

}} else

;while(n1!=n2)

return n1;

} return null;

}

條件(3)一般的樹且沒有指向父親的指標

一般的樹,每個節點的子節點個數可以不一樣。那麼我們就用通用的方法,找到由根節點到兩個節點的路徑,然後找這兩個路徑的最後乙個公共節點即可。關鍵是儲存遍歷路徑,我們採用前向遍歷的方法,先遍歷根節點,再依次遍歷每個子節點。**如下:

struct treenode2

;bool getpath(treenode2* root,treenode2* node,vector& path)//前向遍歷

if(!found)

path.pop_back();//不是該路徑則輸出最尾元素

return found;

}treenode2 * lastcommonfather(const vector&path1,const vector&path2)

return last;

}treenode2* findnearestfather2(treenode2* root,treenode2* node1,treenode2* node2)

return null;

}

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

首先想一下 一.如果是搜尋二叉樹的話 可以採用遞迴的方式 思路 樹的根節點作為尋找的起點,把根節點作為當前節點 1.如果這兩個節點都大於當前節點,那麼這兩個節點的最低祖先肯定在當前節點節點的右子樹中,然後在當前節點的右子樹中找 2.如果兩個節點的都小於當前節點節點,那麼這兩個節點的最低祖先肯定在當前...

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

假設是二叉搜尋樹 二叉搜尋樹是乙個排序的二叉樹,左子樹的結點小於根結點,右子樹的結點大於根結點 故找到乙個結點,使其大於左子結點小於右子結點即可。public static treenode getlastcommonnode treenode root,treenode p,treenode q ...

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

題目 輸入一棵樹的兩個節點,返回他們的最低公共祖先。當這棵樹是二叉查詢樹時 用遞迴從樹的根節點開始遍歷。private treenode find treenode node1,treenode node2,treenode root if val如果這棵樹只是一顆普通的樹,但是擁有指向父節點的指標...