最低公共祖先問題 鍊錶 樹

2022-08-16 12:57:12 字數 1430 閱讀 6514

//兩個鍊錶的第乙個公共節點:可以利用兩個輔助棧實現, 也

//可以遍歷鍊錶兩次,求節點個數差,長的鍊錶先遍歷, 然後同時開始遍歷, 找到相同節點

struct listnode;

listnode* firstpublicnode(listnode* phead1, listnode* phead2)

while (pnode2 != nullptr)

pnode1 = (list1nodes > list2nodes) ? phead1 : phead2;

pnode2 = (pnode1 == phead1) ? phead2 : phead2;

int nodesdiff = abs(list1nodes - list2nodes);

while (nodesdiff--)

while (pnode1 != nullptr && pnode2 != nullptr)

else

return pnode1;

}}

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

//情況一:說明是二叉樹, 二叉查詢樹(排序的二叉樹):那麼從樹的根節點開始遍歷大於兩個節點值則遍歷左子樹,小於則遍歷右子樹

struct binarytreenode;

bool isleaf(binarytreenode* pnode)

binarytreenode* leastcommonancestor(binarytreenode* phead, binarytreenode* pnode1, binarytreenode* pnode2)

binarytreenode* pnode = phead;

while (!isleaf(pnode))

else

}return nullptr;

}//情況二:說明是任意的樹,節點有指向父節點的指標:轉換為了求兩個鍊錶(兩個節點到根節點的鍊錶)第乙個公共節點的問題,

struct treenode;

treenode* leastcommonancestor(treenode* pnode1, treenode* pnode2)

while (plisthead2 != nullptr)

plisthead1 = pnode1;

plisthead2 = pnode2;

int listlendiff = listlen1 - listlen2;

if (listlen1 < listlen2)

while (listlendiff--)

while (plisthead1 != nullptr && plisthead2 != nullptr)

else

return plisthead1;

}return nullptr;

}

最低公共祖先

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

最低公共祖先

對於樹中兩個節點而言,最低公共祖先lca其實就是該節點左邊和右邊分別包含a,b兩個節點。只有a,b分別在其左右子樹中。首先判斷該節點是否非空,空返回null,表示既沒有a,有沒有b 如果該節點本身是a,或者b中的乙個則返回該節點 遞迴的判斷該節點的左右子樹,如果左右子樹都不是返回null,說明左右子...

Tree 最低公共祖先系列

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