LeetCode236二叉樹的最近公共祖先

2021-10-24 17:13:19 字數 1170 閱讀 1614

目錄遞迴

**實現

複雜度分析

非遞迴**實現

複雜度分析

二叉樹的最近公共祖先

遞迴遍歷整棵二叉樹,定義

自底向上從葉子節點開始更新,在所有滿足條件的公共祖先中一定是深度最大的祖先先被訪問到。

/**

* definition for a binary tree node.

* public class treenode

* }*/class solution

public boolean dfs(treenode root, treenode p, treenode q)

boolean lson = dfs(root.left, p, q);

boolean rson = dfs(root.right, p, q);

if((lson && rson) || (root.val == p.val || root.val == q.val) && (lson || rson))

return(lson || rson || root.val == p.val || root.val == q.val);}}

時間複雜度:空間複雜度:

先用hash表儲存所有節點的父節點;利用節點的父節點從p開始往上查詢,將訪問過的節點記錄;從q節點開始往上查詢,如果碰到已經訪問過的節點,這個節點就是我們要找的最近公共祖先。

/**

* definition for a binary tree node.

* public class treenode

* }*/class solution

dfs(root);

while(p != null)

while(q != null)

q = parentsmap.get(q);

}return null;

}public void dfs(treenode root)

if(root.left != null)

if(root.right != null)}}

實現細節:set的介面是add而不是put

時間複雜度:

空間複雜度:,雜湊表儲存的每個節點的父節點也需要

LeetCode236 二叉樹最近祖先

思考 這個函式就是查詢p,q兩個節點的祖先,然後給了這棵樹的root,1 它先進行判斷,根節點是不是null 或者根節點是否是p q,要是有乙個是,那祖先就肯定是root 2 它用了遞迴的思想去查詢左右兩個子樹,因為pq的祖先要麼在左邊,要麼就在右邊,所以肯定能找到乙個祖先。3 若找到的left 子...

LeetCode 236 二叉樹最近公共祖先

leetcode 236 二叉樹最近公共祖先 236.二叉樹的最近公共祖先 題目描述 給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。解體思路 分兩部分解決 第一部分 實現判斷兩個結點包含於某根節點的子樹內 第二部分 先序遍歷二叉樹,如果根節點的子樹包含qp目標結點 傳入左孩子,進行遞迴。傳入...

leetcode 236 二叉樹最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 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 的最近公共祖先是節點 ...