題目描述:
給定一棵二叉樹的根節點 root 以及兩個整數 p 和 q ,返回該二叉樹中值為 p 的結點與值為 q 的結點間的 距離 。
兩個結點間的 距離 就是從乙個結點到另乙個結點的路徑上邊的數目。
示例 1:
輸入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 0
輸出:3
解釋:在 5 和 0 之間有 3 條邊:5-3-1-0
示例 2:
輸入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 7
輸出:2
解釋:在 5 和 7 之間有 2 條邊:5-2-7
示例 3:
輸入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 5
輸出:0
解釋:乙個結點與它本身之間的距離為 0
樹中結點個數的範圍在 [1, 104].
0 <= node.val <= 109
樹中所有結點的值都是唯一的.
p 和q 是樹中結點的值.
方法1:
(1)先找出兩個結點的最近公共祖先;
(2)然後從最近公共祖先出發,找出到兩個結點之間的距離;
/**
* definition for a binary tree node.
* struct treenode
* treenode(int x) : val(x), left(nullptr), right(nullptr) {}
* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}
* };
*/class
solution
if(root-
>val==q||root-
>val==p)
treenode* left_node=
find_node
(root-
>left,q,p)
; treenode* right_node=
find_node
(root-
>right,q,p);if
(left_node!=
nullptr
&&right_node!=
nullptr)if
(left_node!=
nullptr)if
(right_node!=
nullptr
)return
nullptr;}
//統計根節點到給定結點值之間的距離
bool
find_dist
(treenode* root,
int v,
int& res)
if(root-
>val==v)
++res;if(
find_dist
(root-
>left,v,res)
||find_dist
(root-
>right,v,res)
)--res;
return
false;}
intfinddistance
(treenode* root,
int p,
int q)
};
找到二叉樹中的最大搜尋二叉樹
題目 給定一顆二叉樹,已知其中所有節點的值都不一樣,找到含有節點最多的二叉搜尋樹,並返回頭節點。注 乙個二叉樹的子樹的葉節點必須是該二叉樹的葉節點。解答 1.後續遍歷 2.每次記錄下最小值,最大值,節總數。如果root左右節點符合,則總數相加後,返回此根節點 否則返回左右節點中節點數最多的節點。輸入...
樹 找到二叉樹中的最大二叉搜尋樹
題目 給定一顆二叉樹,已知其中所有節點的值都不一樣,找到含有節點最多的二叉搜尋樹,並返回頭節點。注 乙個二叉樹的子樹的葉節點必須是該二叉樹的葉節點。解答 以節點root為頭的樹中,最大的二叉搜尋樹只可能來自以下兩種情況。1.如果來自root左子樹上的最大st以root.left為頭,來自root右子...
二叉樹最大距離
問題描述 給出一棵二叉樹,求二叉樹上最遠的兩個節點的距離 分析 最長距離即兩個節點間經過的路徑最長,可以把問題分解為每個節點的左子樹的最大深度與右子樹的最大深度之和的最大值,保留這個最大值並對比各節點的最大值即可得出 遞迴演算法如下 int max 0 int depth node root int...