劍指Offer68 II 二叉樹的最近公共祖先

2021-10-21 08:38:07 字數 1466 閱讀 8578

//不能覆蓋p,q其中乙個是另乙個的祖先的情況

class

solution

else

if(l || r)

return

true

;//其中一棵子樹找到了p或q,往上層傳遞

else

return

false

;//兩棵廢物子樹,都找不到p,q

} treenode*

lowestcommonancestor

(treenode* root, treenode* p, treenode* q)};

//強行這麼寫,太麻煩了

class

solution

bool l =

dfs(root-

>left, p, q)

;bool r =

dfs(root-

>right, p, q);if

(l && r)

else

if(l || r)

return

true

;//其中一棵子樹找到了p或q,往上層傳遞

else

return

false

;//兩棵廢物子樹,都找不到p,q

} treenode*

lowestcommonancestor

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

};

因此,嘗試返回值用treenode*,返回空說明當前子樹為空,或者當前子樹找不到目標p或q;返回非空說明當前子樹找到了目標p或q:包括本身root是p或q,以及左右子樹找到了p或q;

③在回溯的過程中,必然要遍歷整顆二叉樹,即使已經找到結果了,依然要把其他節點遍歷完,因為要利用遞迴函式的返回值作邏輯處理:

//遍歷整棵樹

auto l =

dfs(root-

>left)

;auto r =

dfs(root-

>right)

;使用l和r作邏輯處理,

//遍歷某條邊if(

dfs(root-

>left)

)return..

.if(dfs

(root-

>right)

)return..

.

④當l,r均為非空(下圖節點7),很好理解,說明左右子樹各找到乙個目標;若其中乙個為空時(節點6,10,8),應返回另乙個,是因為要把p,q逐層傳上去(節點6),或者找到最近公共祖先後,把該祖先逐層傳上去(節點10,8);

劍指Offer 68 II 二叉樹的最近公共祖先

劍指offer contents思路2 到p,q的路徑的最後共同節點 解答解答2 到p,q的路徑的最後共同節點 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1 輸出 3 解釋 節點 5 和節點 1 的最近公共祖先是節點 3。示例 2 輸入 root 3,5,1...

劍指offer 55 II 平衡二叉樹

題目鏈結 輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。示例 1 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 返回 true 示例 2 給定二叉樹 1,2,2,3,3,null,nu...

劍指offer55 II 平衡二叉樹

題目 輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。分析 平衡二叉樹 balance tree 的定義是 二叉樹中任意節點的左右子樹的深度相差不超過1。注意是任意節點,並不只是根節點的 左深度 右深度 還有其子樹也必須是平衡二叉樹。從該定義也可知是利用遞迴來解決這個問題。class soluti...