最低公共祖先

2021-08-22 08:52:48 字數 1399 閱讀 1442

對於樹中兩個節點而言,最低公共祖先lca其實就是該節點左邊和右邊分別包含a,b兩個節點。只有a,b分別在其左右子樹中。

首先判斷該節點是否非空,空返回null,表示既沒有a,有沒有b

如果該節點本身是a,或者b中的乙個則返回該節點

遞迴的判斷該節點的左右子樹,如果左右子樹都不是返回null,說明左右子樹分別包含a,b那麼就可以返回root。(注意,這是因為上面的如果分支中包含a,或者b,則一定不會返回null)

如果不是root,那麼必然是左子樹或者右子樹中非空的那乙個。

/**

* definition of treenode:

* class treenode

* }*/class solution

};

自底向上遍歷直至根,問題轉化為尋找兩個鍊錶的公共節點的問題,**如下。

/**

* definition of parenttreenode:

* class parenttreenode

*/class solution

parenttreenode* tmpb=b;

while(tmpb!=root)

int diff=abs(na-nb);

parenttreenode* lnode=null;

parenttreenode* snode=null;

lnode=na>nb?a:b;

if(lnode==a)

snode=b;

else

snode=a;

while(diff)

while(lnode!=snode)

return lnode;

}};

首先判斷是否一樣,一樣直接返回,否則繼續判斷

不一樣則可以先採取一種遍歷策略(本文選擇中序遍歷)計量是否都存在,如果不是都存在,返回null,否則情況退化成場景一按照方法一進行返回即可。

/**

* definition of treenode:

* class treenode

* }*/class solution

void postorder(treenode* root,treenode* a,treenode* b,int & findnums)

postorder(root->left,a, b,findnums);

postorder(root->right, a, b,findnums);

}treenode* lca(treenode* root,treenode* a,treenode* b)

};

最低公共祖先

二叉樹結點的定義如下 cpp view plain copy struct node 給定二叉樹中的兩個結點,輸出這兩個結點的最低公共祖先結點 lca 注意,該二叉樹不一定是二叉搜尋樹。比如給定的二叉樹如下所示,則可以知道結點1和5的最低公共祖先結點為5,結點4和5的最低公共祖先結點為5。3 5 1...

Tree 最低公共祖先系列

原題目 在bst中的特殊形式使得假如出現了乙個數比其中乙個小,比另乙個大就是復合題意了。不可能出現還有另外的情況。public treenode lowestcommonancestor treenode node,treenode p,treenode q else if root.val p.v...

最低公共祖先問題 鍊錶 樹

兩個鍊錶的第乙個公共節點 可以利用兩個輔助棧實現,也 可以遍歷鍊錶兩次,求節點個數差,長的鍊錶先遍歷,然後同時開始遍歷,找到相同節點 struct listnode listnode firstpublicnode listnode phead1,listnode phead2 while pnod...