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

2021-09-17 04:14:47 字數 1773 閱讀 4162

場景一: 二叉搜尋樹bst

假設是二叉搜尋樹(二叉搜尋樹是乙個排序的二叉樹,左子樹的結點小於根結點,右子樹的結點大於根結點),故找到乙個結點,使其大於左子結點小於右子結點即可。

**

public static treenode getlastcommonnode(treenode proot, treenode pleft, treenode pright)

if(proot.val >= pright.val)

if(proot.val <= pleft.val)

if(proot.val >= pleft.val && proot.val <= pright.val)

return treenode;

}

場景一: 普通二叉樹

假設是普通的二叉樹。遞迴遍歷找到所給定的兩個結點,然後向上標記,直到有乙個結點的左子結點和右子結點都不為空返回

**

public static btreenode getlastcommonnode(btreenode proot, btreenode pleft, btreenode pright)

//檢視左子樹中是否有目標結點,沒有為null

btreenode left = getlastcommonnode(proot.left, pleft, pright);

//檢視右子樹是否有目標節點,沒有為null

btreenode right = getlastcommonnode(proot.right, pleft, pright);

//都不為空,說明做右子樹都有目標結點,則公共祖先就是本身

if(left != null && right != null)

//如果發現了目標節點,則繼續向上標記為該目標節點

return left == null ? right : right;

}

場景三

假設就是一棵普通的數,子結點沒有指向父結點的指標。直接用動態陣列儲存兩個樹的路徑,然後比較得到第乙個公共點。

public static treenode getlastcommonparent(treenode proot, treenode p1, treenode p2)

return getlastcommonparent(path1, path2);}

//獲取根節點到目標節點的路徑

public static void getnodepath(treenode proot, treenode pnode, arraylisttmplist, arraylistpath)

tmplist.add(proot);

arraylistchilds = proot.children;

for(treenode node : childs)

getnodepath(node, pnode, tmplist, path);

} tmplist.remove(tmplist.size()-1); //清空集合}

private static treenode getlastcommonparent(arraylistpath1, arraylistpath2)

//迴圈結束時tmpnode即為最後乙個共同結點

tmpnode = path1.get(i);

} return tmpnode;

}

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

題目 輸入兩個樹結點,求它們的最低公共祖先 題目一 如果這個樹是二叉搜尋樹,二叉搜尋樹是排序過的,位於左子樹的結點都比父結點小,而位於右子樹的結點都比父結點大,我們只需要從樹的根結點開始和兩個輸入的結點比較,如果輸入兩個結點都比根結點小,那麼最低的共同父結點一定在當前結點的左子樹中,於是下一步遍歷當...

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

在進行這個問題之前,我們需要考慮以下幾個問題 1 題目告訴我們是樹,但是沒有告訴我們是一棵怎樣的樹。這裡的樹可以分為三種結構。第一種 普通的二叉樹 第二種 結點中含有指向父親結點的指標 第三種 二叉搜尋樹。2 對於不同結構的樹,處理的方式是不一樣的,時間複雜度也是不一樣的,我們需要針對每種結構設計解...

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

遇到這個題要分幾種情況 1 該樹是一棵二叉搜尋樹 由於二叉搜尋樹是排序過的,位於左子樹的結點都比父節點小,而位於右子樹的結點都比父節點大,我們只需要從樹的根節點開始和兩個輸入的結點進行比較。如果當前結點的值都比兩個結點的值大,那麼最低的共同父節點一定是在當前結點的左子樹中,於是下一步遍歷當前結點的左...