演算法 二叉樹 DFS 二叉樹的最近公共祖先

2021-10-05 19:18:57 字數 2558 閱讀 5965

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

例如,給定如下二叉樹: 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 為不同節點且均存在於給定的二叉樹中。

dfs深度優先方式查詢給定的節點p和q,有幾種情況:

情況1,要找的p或q中的乙個為當前root,而另乙個在左或右子樹中,則當前root就是兩個指定節點的最近公共祖先

情況2,要找的p或q都不是當前root,且分別存在於不同子樹,則當前root就是兩個指定節點的最近公共祖先

情況3,要找的p或q都不是當前root,且都存在於同乙個子樹,則當前root不是兩個指定節點的最近公共祖先,應該繼續往那個子樹查詢。

情況4,要找的p或q都不是當前root,且只有乙個存在於子樹或兩個都不存在於子樹,則當前root不是兩個指定節點的最近公共祖先,應該繼續回溯查詢其他節點。

/**

* definition for a binary tree node.

* public class treenode

* }*/class

solution

// 前序遍歷尋找p或q

// 只要在當前root節點及其左右子樹找到p或p就返回true

private

boolean

preorder

(treenode root, treenode p, treenode q)

boolean rootfind =

false;if

(p == root || q == root)

// 分別在左右子樹搜尋p和q

boolean leftfind =

preorder

(root.left, p, q)

;boolean rightfind =

preorder

(root.right, p, q)

;// 情況1,要找的p或q中的乙個為當前root,而另乙個在左或右子樹中,則當前root就是兩個指定節點的最近公共祖先

// 情況2,要找的p或q都不是當前root,且分別存在於不同子樹,則當前root就是兩個指定節點的最近公共祖先if(

(rootfind &&

(leftfind || rightfind))||

(leftfind && rightfind)

)// 情況3,要找的p或q都不是當前root,且分別存在於同乙個子樹或只有乙個存在於子樹或兩個都不存在於子樹,

// 則當前root不是兩個指定節點的最近公共祖先

// 只要在root或左右子樹找到p或q,就返回true

前面dfs效率不錯,但是**有點多,分支複雜,能不能直接用原方法遞迴求解呢?

/**

* definition for a binary tree node.

* public class treenode

* }*/class

solution

// 找到p或q

if(root == p || root == q)

// 在左子樹查詢p和q

treenode left =

lowestcommonancestor

(root.left, p, q)

;// 左子樹沒有,則肯定在右子樹

if(left == null)

// 否則說明左子樹至少有p或q中的乙個,繼續看右子樹有沒有另乙個

treenode right =

lowestcommonancestor

(root.right, p, q)

;// 如果右子樹沒有則說明兩個在left及其子樹中,且left節點為最近公共祖先

// 否則當前root就是最近公共祖先

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...

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

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