二叉樹建立不跳出 236 二叉樹的最近公共祖先

2021-10-12 07:54:09 字數 1585 閱讀 2960

面試題68 - ii. 二叉樹的最近公共祖先

給定乙個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。

例如,給定如下二叉樹: root = [3,5,1,6,2,0,8,null,null,7,4]

輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1

輸出: 3

解釋: 節點 5 和節點 1 的最近公共祖先是節點 3。

輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4

輸出: 5

解釋: 節點 5 和節點 4 的最近公共祖先是節點 5。因為根據定義最近公共祖先節點可以為節點本身。

說明:

所有節點的值都是唯一的。

p、q 為不同節點且均存在於給定的二叉樹中。

關鍵點在於,二叉樹的後序遍歷

分析題意,找兩個節點的最近公共祖先,無非是找到二叉樹的某個節點,找節點無非前序、中序、後序遍歷而已。 那麼先來分析下都可能有哪些情況。

乙個節點是最近公共祖先,應當滿足:

用遞迴思想來解決這個問題。上面分析就是最終的可能取值,所以跳出遞迴的條件無非是node == null,表示下面沒節點了,這次遞迴到頭了,樹的遍歷一般都是這個條件。若只有這乙個條件最後顯然無法返回我們需要的節點,上面分析可知p, q自身都可能是取值,故而可將搜尋到p,q也作為終止條件,這裡注意千萬不要覺得只搜尋乙個p,或者q就終止會丟掉另乙個q,或者p,這只是區域性遞迴結束了而已。 假設左右子樹都有了區域性值,那最終結果就可能已經得出了。即,

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

treenode* dfs(treenode *root, treenode* p, treenode* q)

if(p == root)

if(q == root)

treenode* left = dfs(root->left, p, q);

treenode* right = dfs(root->right, p, q);

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

} };

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

建立二叉樹 後序建立二叉樹

由後序遍歷可知,輸入順序是左結點 右結點 子樹根結點 比如輸入如下樹 ab cde 輸入序列為 e d b c a 思路 使用棧,對左結點和右結點進行壓棧 1.當輸入遇到非 且棧中元素大於等於2,則可以確定乙個小三角樹形,並將這個樹根作為下乙個小三角樹形的乙個子節點 2.當輸入遇到非 但棧中元素小於...

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...