力扣OJ題 二叉樹的最近公共祖先

2021-09-27 04:45:15 字數 1491 閱讀 5424

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

例如,給定如下二叉樹:  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。因為根據定義最近公共祖先節點可以為節點本身。

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

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

這道題需要在借助另乙個方法才能做,這個方法就是在乙個樹中查詢是否存在乙個節點。

這個方法有四種情況:

1)這棵樹如果是空樹就直接返回false

2)判斷根節點是否就是要找的這個節點

3)判斷根節點的左子樹中是否存在這個節點

4)判斷根節點的左子樹中是否存在這個節點

注意:判斷根節點的左子樹和右子樹時可以運用遞迴來查詢,如果找到了就返回true,反之返回false

接著就是找公共祖先的這個方法了,對這個方法,同樣可以用遞迴

呼叫上面剛說的查詢的方法,判斷 p , q 是否存在於左子樹中。如果 p 或者 q 就是根節點,那麼就直接返回根節點 root ;如果全在左子樹中,那麼遞迴呼叫找公共祖先的這個方法繼續查詢距離最近的祖先(此時樹的根節點會發生變化,變成 root . left );同樣,如果全在右子樹中,那麼遞迴呼叫找公共祖先的這個方法繼續查詢距離最近的祖先(此時樹的根節點會發生變化,變成 root . right ),剩餘的情況就是 p 和 q  不在同一邊 (無論 p 在哪一邊都沒有關係,肯定和 q 沒在一邊),那麼就直接將root返回。

class solution 

boolean pleft = search(root.left,p);

boolean qleft = search(root.left,q);

//p,q都在左子樹

if(pleft && qleft)

//都在右子樹

if( !pleft && !qleft)

return root;

}//查詢q是否在p中

public static boolean search(treenode p, treenode q)

if (p == q)

if(search(p.left,q))

return search(p.right,q);

}}

二叉樹 力扣 二叉樹的最近公共祖先

如果二叉樹結點中儲存了雙親的位置和值域的話 比如雙親表示法或者是孩子雙親表示法 可以轉換為兩個鍊錶求交點的問題 二叉搜尋樹特點 根節點比左子樹中所有節點都大,比所有右子樹中的節點都小 根據中序遍歷可以得到乙個有序序列 如果樹是二叉搜尋樹 二叉排序樹 此時分為如下幾種情況 假設我們要找的是p,q的公共...

力扣 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 的最近公共祖先是節點 ...

力扣 236二叉樹的最近公共祖先

自底向上,有點後序遍歷的意思。其實在自上而下遞迴之前,先篩選當前節點也能ac 1 後序遍歷,左右根的遍歷。2 首先確保本節點非null,或者與目標節點相同直接返回本節點。3 本節點非空,則判斷左右子節點是否為null。這裡分為4種情況 1 左右子節點都為null,那就不為所求了,直接返回null 2...