在進行這個問題之前,我們需要考慮以下幾個問題:
(1)題目告訴我們是樹,但是沒有告訴我們是一棵怎樣的樹。這裡的樹可以分為三種結構。第一種:普通的二叉樹;第二種:結點中含有指向父親結點的指標;第三種:二叉搜尋樹。
(2)對於不同結構的樹,處理的方式是不一樣的,時間複雜度也是不一樣的,我們需要針對每種結構設計解法。
1. 二叉搜尋樹
二叉搜尋樹的左子樹比根節點小,右子樹的值比根節點大,我們可以根據這個性質來考慮這個問題。
我們可以將兩個結點分別和根節點做比較,如果兩個結點都比根節點小,則在左子樹繼續比較,反之,則在右子樹中繼續比較,直到找到乙個結點比根節點大或著等於,乙個結點比根節點小,則這個根節點就是最低公共祖先。
};2. 含有指向父節點的指標
如果樹中含有指向父節點的指標,那麼我們可以從最低的葉子結點開始到根節點,看成一條由父節點指向下乙個結點的單鏈表,這樣問題就可以轉化為求兩條單鏈表的相交結點了。
};3. 普通二叉樹
普通二叉樹相比之下有點難,不過我們可以將第二種方法變換一下,從根節點開始向下遍歷,並將遍歷到的結點儲存在某一容器中,這樣就形成了一條到指定結點的路徑,然後根據兩個結點的路徑找相同的結點,這個相同的結點就是最低公共祖先。
};第二種方式:
templateclass tree
bool isinthebinarytree(treenode* root,treenode* n)
};
樹中兩個結點的最低公共祖先
題目 輸入兩個樹結點,求它們的最低公共祖先 題目一 如果這個樹是二叉搜尋樹,二叉搜尋樹是排序過的,位於左子樹的結點都比父結點小,而位於右子樹的結點都比父結點大,我們只需要從樹的根結點開始和兩個輸入的結點比較,如果輸入兩個結點都比根結點小,那麼最低的共同父結點一定在當前結點的左子樹中,於是下一步遍歷當...
樹中兩個結點的最低公共祖先
場景一 二叉搜尋樹bst 假設是二叉搜尋樹 二叉搜尋樹是乙個排序的二叉樹,左子樹的結點小於根結點,右子樹的結點大於根結點 故找到乙個結點,使其大於左子結點小於右子結點即可。public static treenode getlastcommonnode treenode proot,treenode...
樹中兩個結點的最低公共祖先
遇到這個題要分幾種情況 1 該樹是一棵二叉搜尋樹 由於二叉搜尋樹是排序過的,位於左子樹的結點都比父節點小,而位於右子樹的結點都比父節點大,我們只需要從樹的根節點開始和兩個輸入的結點進行比較。如果當前結點的值都比兩個結點的值大,那麼最低的共同父節點一定是在當前結點的左子樹中,於是下一步遍歷當前結點的左...