此題最直觀的方法是兩次dfs,分別找到這兩個節點的path,然後遍歷path1和path2做比較,找到最後乙個共同的元素。這個普通的做法在:
但有個更好的辦法能夠一次dfs中找到,沒有o(logn)的額外空間。參見:
現在這段**有乙個用例沒有過,應該是沒有同時找到兩個節點(比如只找到乙個)。這樣可以放兩個是否找到a和b的bool,最後有用,但這樣**會複雜不少。過會再做。(現在這段**只適用於兩個子節點都有的情況。
但事實上lca是乙個成熟的演算法,參考: 有空回來再研究(看了一下,那個好像是基於並查集的離線演算法)。
如果是二叉排序樹,則可利用左右大小的性質:
#include #include using namespace std;struct node;
void createtree(node *&root)}
node* getcommonnode(node *&root, int a, int b)
else if (root->x == a || root->x == b)
else
}} void destory(node *&root)}
void print(node *root)}
int main()
else
destory(root);}}
return 0;
}
樹中兩個結點的最低公共祖先
題目 輸入兩個樹結點,求它們的最低公共祖先 題目一 如果這個樹是二叉搜尋樹,二叉搜尋樹是排序過的,位於左子樹的結點都比父結點小,而位於右子樹的結點都比父結點大,我們只需要從樹的根結點開始和兩個輸入的結點比較,如果輸入兩個結點都比根結點小,那麼最低的共同父結點一定在當前結點的左子樹中,於是下一步遍歷當...
樹中兩個結點的最低公共祖先
在進行這個問題之前,我們需要考慮以下幾個問題 1 題目告訴我們是樹,但是沒有告訴我們是一棵怎樣的樹。這裡的樹可以分為三種結構。第一種 普通的二叉樹 第二種 結點中含有指向父親結點的指標 第三種 二叉搜尋樹。2 對於不同結構的樹,處理的方式是不一樣的,時間複雜度也是不一樣的,我們需要針對每種結構設計解...
樹中兩個結點的最低公共祖先
場景一 二叉搜尋樹bst 假設是二叉搜尋樹 二叉搜尋樹是乙個排序的二叉樹,左子樹的結點小於根結點,右子樹的結點大於根結點 故找到乙個結點,使其大於左子結點小於右子結點即可。public static treenode getlastcommonnode treenode proot,treenode...