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