二叉樹的最近公共祖先

2021-10-03 10:38:57 字數 1556 閱讀 2957

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

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

示例 1:

輸入: 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,6,2,0,8,null,null,7,4], p = 5, q = 4

輸出: 5

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

說明:

思路一:使用棧來判斷路徑

這個思路是我自己想的,我竟然可以自己做出這麼複雜的題目了,哈哈哈。

首先利用遞迴,找到目標節點,然後將它入棧裡,再把它的父節點入棧……一直到根節點。兩個節點分別對應兩個棧,然後再分別出棧,最後乙個相等的節點就是最近公共祖先啦。

class

solution

else

}return res;

}//判斷有沒有找到對應節點

public

boolean

findnode

(treenode node,treenode target,stack

stack)

if(node==null)

return

false;if

(findnode

(node.left,target,stack)

||findnode

(node.right,target,stack)

)return

false;}

}

思路二:

這個思路和我差不多,都是用遞迴加乙個boolean判斷。不過這個就精巧很多,不需要判斷路徑,只要乙個節點的左右子節點返回都為true,那麼這個節點就是最近公共祖先。

class

solution

//判斷有沒有找到對應節點

public

boolean

findnode

(treenode node,treenode p,treenode q)

boolean leftfind =

findnode

(node.left,p,q)

;boolean rightfind =

findnode

(node.right,p,q);if

(leftfind && rightfind)

if(leftfind || rightfind)

return

false;}

}

二叉樹的最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 思路 剛開始使用boolean來判斷要查詢的兩節點在左右孩子上,後面修改為使用treenode與null判斷兩節點位置 1 分別向左孩子和右孩子遞迴。2 若當...

二叉樹的最近公共祖先

輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1 輸出 3 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 4 輸出 5 法1 分別找出根節點到兩個節點的路徑,則最後乙個公共節點就是最低公共祖先。法2 public treen...

二叉樹的最近公共祖先

例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 示例 1 輸入 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,6,2,0,...