树
深度优先搜索
广度优先搜索
二叉树
题目描述
给定一棵具有 n
个节点的 特殊 二叉树的根节点 root
。特殊二叉树的节点编号从 1
到 n
。假设这棵树有 k
个叶子,顺序如下:b1 < b2 < ... < bk
。
这棵树的叶子节点有一个 特殊 属性 !对于每个叶子节点 bi
,满足以下条件:
如果 i < k
,则 bi
的右子节点为 bi + 1
;否则为 b1
。
如果 i > 1
,则 bi
的左子节点为 bi - 1
;否则为 bk
。
返回给定树的高度。
注意 :二叉树的高度是指从根节点到任何其他节点的 最长路径 的长度。
示例 1;
输入: root = [1,2,3,null,null,4,5]
输出: 2
解释:给 定树如下图所示。每个叶子节点的左子节点是它左边的叶子节点(用蓝色边表示)。每个叶子节点的右子节点是它右边的叶子节点(用红色边表示)。我们可以看出,该图的高度为2。
示例 2:
输入: root = [1,2]
输出: 1
解释: 给定树如下图所示。只有一个叶子节点,所以它没有左子节点或右子节点。我们可以看出,该图的高度为 1。
示例 3:
输入: root = [1,2,3,null,null,4,null,5,6]
输出: 3
解释: 给定树如下图所示。每个叶子节点的左子节点是它左边的叶子节点(用蓝色边表示)。每个叶子节点的右子节点是它右边的叶子节点(用红色边表示)。我们可以看出,该图的高度为3。
提示:
n 为树中节点的数量
2 <= n <= 104
1 <= node.val <= n
输入保证每个 node.val
的值是唯一的。
解法
方法一:DFS
题目的关键在于如何判断一个节点是叶子节点,我们设计一个函数 $dfs(root, d)$,其中 $root$ 表示当前节点,而 $d$ 表示当前节点的深度,我们每次搜索时,更新答案 $ans = \max(ans, d)$,然后判断当前节点是否为叶子节点,如果当前节点有左子节点,且左子节点的右子节点不是当前节点,那么我们递归调用 $dfs(root.left, d + 1)$,如果当前节点有右子节点,且右子节点的左子节点不是当前节点,那么我们递归调用 $dfs(root.right, d + 1)$。
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的节点数。
Python3 Java C++ Go TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 # Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution :
def heightOfTree ( self , root : Optional [ TreeNode ]) -> int :
def dfs ( root : Optional [ TreeNode ], d : int ):
nonlocal ans
ans = max ( ans , d )
if root . left and root . left . right != root :
dfs ( root . left , d + 1 )
if root . right and root . right . left != root :
dfs ( root . right , d + 1 )
ans = 0
dfs ( root , 0 )
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 /**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int ans ;
public int heightOfTree ( TreeNode root ) {
dfs ( root , 0 );
return ans ;
}
private void dfs ( TreeNode root , int d ) {
ans = Math . max ( ans , d ++ );
if ( root . left != null && root . left . right != root ) {
dfs ( root . left , d );
}
if ( root . right != null && root . right . left != root ) {
dfs ( root . right , d );
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public :
int heightOfTree ( TreeNode * root ) {
int ans = 0 ;
function < void ( TreeNode * , int ) > dfs = [ & ]( TreeNode * root , int d ) {
ans = max ( ans , d ++ );
if ( root -> left && root -> left -> right != root ) {
dfs ( root -> left , d );
}
if ( root -> right && root -> right -> left != root ) {
dfs ( root -> right , d );
}
};
dfs ( root , 0 );
return ans ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 /**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func heightOfTree ( root * TreeNode ) ( ans int ) {
var dfs func ( * TreeNode , int )
dfs = func ( root * TreeNode , d int ) {
if ans < d {
ans = d
}
d ++
if root . Left != nil && root . Left . Right != root {
dfs ( root . Left , d )
}
if root . Right != nil && root . Right . Left != root {
dfs ( root . Right , d )
}
}
dfs ( root , 0 )
return
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function heightOfTree ( root : TreeNode | null ) : number {
let ans = 0 ;
const dfs = ( root : TreeNode | null , d : number ) => {
ans = Math . max ( ans , d ++ );
if ( root . left && root . left . right !== root ) {
dfs ( root . left , d );
}
if ( root . right && root . right . left !== root ) {
dfs ( root . right , d );
}
};
dfs ( root , 0 );
return ans ;
}
GitHub