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

2021-10-08 23:43:28 字數 3427 閱讀 2377

如果二叉樹結點中儲存了雙親的位置和值域的話(比如雙親表示法或者是孩子雙親表示法),可以轉換為兩個鍊錶求交點的問題

二叉搜尋樹特點

根節點比左子樹中所有節點都大,比所有右子樹中的節點都小;

根據中序遍歷可以得到乙個有序序列

如果樹是二叉搜尋樹(二叉排序樹),此時分為如下幾種情況(假設我們要找的是p,q的公共祖先):

如果p,q有乙個在根的位置 || p,q分別在根節點的左右子樹中(qroot)

最近的公共祖先一定是根節點

p

p>root && q>root即p,q都在root右子樹

遞迴到右子樹中查詢

這種一般情況的求解方式參考情況1和情況2

方法一:(由情況一的思路擴充套件)

由於是孩子表示法,所以只能從根開始找到p所經結點,到q所經結點,but 我們檢視最近公共祖先的時候是從結點往根開始找的,所以此處需要用到棧的特性,將途中所經結點儲存再棧中

獲取到結點所經的路徑:

比如說獲取根結點到e點所經路徑

// 先獲取到p,q結點的路徑

public

boolean

nodepath

(treenode root, treenode node, stack

path)

// 將當前結點入棧

path.

push

(root);if

(node == root)if(

nodepath

(root.left,node,path)

||nodepath

(root.right,node,path)

)// 沒在樹中找到node,所以之前壓棧的結點要刪掉

path.

pop();

return

false

;}

得到p,q所經節點後,將他們儲存在兩個棧中,比較兩個棧當中的元素(比較的時候類似於求鍊錶相交,先讓元素多的棧彈出元素,一直彈出到兩個棧元素個數相等,然後開始比較兩個棧的棧頂)

/**

* definition for a binary tree node.

* public class treenode

* }*/class

solution

stack

ppath =

newstack

<

>()

;nodepath

(root,p,ppath)

; stack

qpath =

newstack

<

>()

;nodepath

(root,q,qpath)

;int psize = ppath.

size()

;int qsize = qpath.

size()

;while

(psize >

0&& qsize >0)

else

if(psize < qsize)

else

else}}

return null;

}// 先獲取到p,q結點的路徑

public

boolean

nodepath

(treenode root, treenode node, stack

path)

// 將當前結點入棧

path.

push

(root);if

(node == root)if(

nodepath

(root.left,node,path)

||nodepath

(root.right,node,path)

)// 沒在樹中找到node,所以之前壓棧的結點要刪掉

path.

pop();

return

false;}

}

方法二:(從第二種情況二叉搜尋樹當中得到啟發)p,q分別在root的左右子樹中–》最近的公共祖先就是root

p,q在root的左子樹中–》遞迴到根節點的左子樹中找

p,q在root的右子樹中–》遞迴到根節點的右子樹中找

那麼如何知道p在根的哪個子樹中–》可以轉成檢測節點是否在一棵樹中的題

看到底是在左右子樹只需要改變傳參,傳參是左子樹的節點就是查詢是否是在左子樹中,傳參是右子樹的節點就是查詢是否是在右子樹中

/**

* definition for a binary tree node.

* public class treenode

* }*/class

solution

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

boolean pinleft =

false

;boolean pinright =

false

;boolean qinleft =

false

;boolean qinright =

false

;// 檢測p在左子樹還是右子樹if(

isintree

(root.right,p)

)else

// 檢測q在左子樹還是右子樹if(

isintree

(root.right,q)

)elseif(

(pinleft && qinright)

||(pinright && qinleft)

)else

if(pinleft && qinleft)

else

}private

boolean

isintree

(treenode root,treenode node)

if(root == node)if(

isintree

(root.left,node)

||isintree

(root.right,node)

)return

false;}

}

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

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

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