-
Notifications
You must be signed in to change notification settings - Fork 0
/
110.平衡二叉树-2.java
135 lines (127 loc) · 3.29 KB
/
110.平衡二叉树-2.java
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
* @lc app=leetcode.cn id=110 lang=java
*
* [110] 平衡二叉树
*
* started at 2020-04-02 14:11:23
*
* finished at 2020-04-02 14:48:48
*
* tips: 使用一个新的类存储遍历信息,实现自底向上
*
* https://leetcode-cn.com/problems/balanced-binary-tree/description/
*
* algorithms
* Easy (50.84%)
* Likes: 276
* Dislikes: 0
* Total Accepted: 62.6K
* Total Submissions: 122.8K
* Testcase Example: '[3,9,20,null,null,15,7]'
*
* 给定一个二叉树,判断它是否是高度平衡的二叉树。
*
* 本题中,一棵高度平衡二叉树定义为:
*
*
* 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
*
*
* 示例 1:
*
* 给定二叉树 [3,9,20,null,null,15,7]
*
* 3
* / \
* 9 20
* / \
* 15 7
*
* 返回 true 。
*
* 示例 2:
*
* 给定二叉树 [1,2,2,3,3,null,null,4,4]
*
* 1
* / \
* 2 2
* / \
* 3 3
* / \
* 4 4
*
*
* 返回 false 。
*
*
*
*/
// @lc code=start
/**
* Definition for a binary tree node. public class TreeNode { int val; TreeNode
* left; TreeNode right; TreeNode(int x) { val = x; } }
*/
class TreeNodeInfo {
int height;
boolean balanced;
TreeNodeInfo treeNodeInfoLeft;
TreeNodeInfo treeNodeInfoRight;
public int getHeight() {
return height;
}
public boolean getBalanced() {
return balanced;
}
public void setHeight(int height) {
this.height = height;
}
public void setBalanced(boolean balanced) {
this.balanced = balanced;
}
public String toString() {
return "[height=" + height + ",balanced=" + balanced + "]\n";
}
}
class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
return helper(root).getBalanced();
}
private TreeNodeInfo helper(TreeNode root) {
if (root == null) {
TreeNodeInfo treeNodeInfo = new TreeNodeInfo();
treeNodeInfo.setBalanced(true);
treeNodeInfo.setHeight(0);
return treeNodeInfo;
}
TreeNodeInfo left = helper(root.left);
if (!left.getBalanced()) {
TreeNodeInfo treeNodeInfo = new TreeNodeInfo();
treeNodeInfo.setBalanced(false);
treeNodeInfo.setHeight(left.height + 1);
return treeNodeInfo;
}
TreeNodeInfo right = helper(root.right);
if (!right.getBalanced()) {
TreeNodeInfo treeNodeInfo = new TreeNodeInfo();
treeNodeInfo.setBalanced(false);
treeNodeInfo.setHeight(right.height + 1);
return treeNodeInfo;
}
if (Math.abs(left.getHeight() - right.getHeight()) < 2) {
TreeNodeInfo treeNodeInfo = new TreeNodeInfo();
treeNodeInfo.setBalanced(true);
treeNodeInfo.setHeight(Math.max(left.getHeight(), right.getHeight()) + 1);
return treeNodeInfo;
}
TreeNodeInfo treeNodeInfo = new TreeNodeInfo();
treeNodeInfo.setBalanced(false);
treeNodeInfo.setHeight(Math.abs(left.getHeight() - right.getHeight()) + 1);
// System.out.println(treeNodeInfo.toString());
return treeNodeInfo;
}
}
// @lc code=end