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