Skip to content

Commit 76a25b4

Browse files
committed
feat: add solutions to lc problem: No.2331
No.2331.Evaluate Boolean Binary Tree
1 parent bbc933b commit 76a25b4

File tree

6 files changed

+214
-37
lines changed

6 files changed

+214
-37
lines changed

solution/2300-2399/2331.Evaluate Boolean Binary Tree/README.md

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,18 @@ OR 运算节点的值为 True OR False = True 。
6262

6363
<!-- 这里可写通用的实现逻辑 -->
6464

65-
**方法一:DFS**
65+
**方法一:递归**
66+
67+
我们可以使用递归的方式来求解本题。
68+
69+
对于当前节点 `root`
70+
71+
- 如果其左右孩子都为空,说明是叶子节点,此时判断其值是否为 $1$,如果是,则返回 `true`,否则返回 `false`
72+
- 否则,对其左右孩子分别递归求解,得到其左右孩子的值 $l$ 和 $r$。然后根据当前节点值的不同,分别进行如下操作:
73+
- 如果当前节点值为 $2$,则返回 `l or r`
74+
- 如果当前节点值为 $3$,则返回 `l && r`
75+
76+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树节点个数。
6677

6778
<!-- tabs:start -->
6879

@@ -88,6 +99,22 @@ class Solution:
8899
return dfs(root)
89100
```
90101

102+
```python
103+
# Definition for a binary tree node.
104+
# class TreeNode:
105+
# def __init__(self, val=0, left=None, right=None):
106+
# self.val = val
107+
# self.left = left
108+
# self.right = right
109+
class Solution:
110+
def evaluateTree(self, root: Optional[TreeNode]) -> bool:
111+
if root.left is None:
112+
return bool(root.val)
113+
l = self.evaluateTree(root.left)
114+
r = self.evaluateTree(root.right)
115+
return l or r if root.val == 2 else l and r
116+
```
117+
91118
### **Java**
92119

93120
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -126,6 +153,34 @@ class Solution {
126153
}
127154
```
128155

156+
```java
157+
/**
158+
* Definition for a binary tree node.
159+
* public class TreeNode {
160+
* int val;
161+
* TreeNode left;
162+
* TreeNode right;
163+
* TreeNode() {}
164+
* TreeNode(int val) { this.val = val; }
165+
* TreeNode(int val, TreeNode left, TreeNode right) {
166+
* this.val = val;
167+
* this.left = left;
168+
* this.right = right;
169+
* }
170+
* }
171+
*/
172+
class Solution {
173+
public boolean evaluateTree(TreeNode root) {
174+
if (root.left == null) {
175+
return root.val == 1;
176+
}
177+
boolean l = evaluateTree(root.left);
178+
boolean r = evaluateTree(root.right);
179+
return root.val == 2 ? l || r : l && r;
180+
}
181+
}
182+
```
183+
129184
### **C++**
130185

131186
```cpp
@@ -155,6 +210,31 @@ public:
155210
};
156211
```
157212

213+
```cpp
214+
/**
215+
* Definition for a binary tree node.
216+
* struct TreeNode {
217+
* int val;
218+
* TreeNode *left;
219+
* TreeNode *right;
220+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
221+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
222+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
223+
* };
224+
*/
225+
class Solution {
226+
public:
227+
bool evaluateTree(TreeNode* root) {
228+
if (!root->left) {
229+
return root->val;
230+
}
231+
bool l = evaluateTree(root->left);
232+
bool r = evaluateTree(root->right);
233+
return root->val == 2 ? l or r : l and r;
234+
}
235+
};
236+
```
237+
158238
### **Go**
159239
160240
```go
@@ -182,6 +262,27 @@ func evaluateTree(root *TreeNode) bool {
182262
}
183263
```
184264

265+
```go
266+
/**
267+
* Definition for a binary tree node.
268+
* type TreeNode struct {
269+
* Val int
270+
* Left *TreeNode
271+
* Right *TreeNode
272+
* }
273+
*/
274+
func evaluateTree(root *TreeNode) bool {
275+
if root.Left == nil {
276+
return root.Val == 1
277+
}
278+
l, r := evaluateTree(root.Left), evaluateTree(root.Right)
279+
if root.Val == 2 {
280+
return l || r
281+
}
282+
return l && r
283+
}
284+
```
285+
185286
### **TypeScript**
186287

187288
```ts

solution/2300-2399/2331.Evaluate Boolean Binary Tree/README_EN.md

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,22 @@ class Solution:
7878
return dfs(root)
7979
```
8080

81+
```python
82+
# Definition for a binary tree node.
83+
# class TreeNode:
84+
# def __init__(self, val=0, left=None, right=None):
85+
# self.val = val
86+
# self.left = left
87+
# self.right = right
88+
class Solution:
89+
def evaluateTree(self, root: Optional[TreeNode]) -> bool:
90+
if root.left is None:
91+
return bool(root.val)
92+
l = self.evaluateTree(root.left)
93+
r = self.evaluateTree(root.right)
94+
return l or r if root.val == 2 else l and r
95+
```
96+
8197
### **Java**
8298

8399
```java
@@ -114,6 +130,34 @@ class Solution {
114130
}
115131
```
116132

133+
```java
134+
/**
135+
* Definition for a binary tree node.
136+
* public class TreeNode {
137+
* int val;
138+
* TreeNode left;
139+
* TreeNode right;
140+
* TreeNode() {}
141+
* TreeNode(int val) { this.val = val; }
142+
* TreeNode(int val, TreeNode left, TreeNode right) {
143+
* this.val = val;
144+
* this.left = left;
145+
* this.right = right;
146+
* }
147+
* }
148+
*/
149+
class Solution {
150+
public boolean evaluateTree(TreeNode root) {
151+
if (root.left == null) {
152+
return root.val == 1;
153+
}
154+
boolean l = evaluateTree(root.left);
155+
boolean r = evaluateTree(root.right);
156+
return root.val == 2 ? l || r : l && r;
157+
}
158+
}
159+
```
160+
117161
### **C++**
118162

119163
```cpp
@@ -143,6 +187,31 @@ public:
143187
};
144188
```
145189

190+
```cpp
191+
/**
192+
* Definition for a binary tree node.
193+
* struct TreeNode {
194+
* int val;
195+
* TreeNode *left;
196+
* TreeNode *right;
197+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
198+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
199+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
200+
* };
201+
*/
202+
class Solution {
203+
public:
204+
bool evaluateTree(TreeNode* root) {
205+
if (!root->left) {
206+
return root->val;
207+
}
208+
bool l = evaluateTree(root->left);
209+
bool r = evaluateTree(root->right);
210+
return root->val == 2 ? l or r : l and r;
211+
}
212+
};
213+
```
214+
146215
### **Go**
147216
148217
```go
@@ -170,6 +239,27 @@ func evaluateTree(root *TreeNode) bool {
170239
}
171240
```
172241

242+
```go
243+
/**
244+
* Definition for a binary tree node.
245+
* type TreeNode struct {
246+
* Val int
247+
* Left *TreeNode
248+
* Right *TreeNode
249+
* }
250+
*/
251+
func evaluateTree(root *TreeNode) bool {
252+
if root.Left == nil {
253+
return root.Val == 1
254+
}
255+
l, r := evaluateTree(root.Left), evaluateTree(root.Right)
256+
if root.Val == 2 {
257+
return l || r
258+
}
259+
return l && r
260+
}
261+
```
262+
173263
### **TypeScript**
174264

175265
```ts

solution/2300-2399/2331.Evaluate Boolean Binary Tree/Solution.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,11 @@
1212
class Solution {
1313
public:
1414
bool evaluateTree(TreeNode* root) {
15-
return dfs(root);
16-
}
17-
18-
bool dfs(TreeNode* root) {
19-
if (!root->left && !root->right) return root->val;
20-
bool l = dfs(root->left), r = dfs(root->right);
21-
if (root->val == 2) return l || r;
22-
return l && r;
15+
if (!root->left) {
16+
return root->val;
17+
}
18+
bool l = evaluateTree(root->left);
19+
bool r = evaluateTree(root->right);
20+
return root->val == 2 ? l or r : l and r;
2321
}
2422
};

solution/2300-2399/2331.Evaluate Boolean Binary Tree/Solution.go

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,12 @@
77
* }
88
*/
99
func evaluateTree(root *TreeNode) bool {
10-
var dfs func(*TreeNode) bool
11-
dfs = func(root *TreeNode) bool {
12-
if root.Left == nil && root.Right == nil {
13-
return root.Val == 1
14-
}
15-
l, r := dfs(root.Left), dfs(root.Right)
16-
if root.Val == 2 {
17-
return l || r
18-
}
19-
return l && r
10+
if root.Left == nil {
11+
return root.Val == 1
2012
}
21-
return dfs(root)
13+
l, r := evaluateTree(root.Left), evaluateTree(root.Right)
14+
if root.Val == 2 {
15+
return l || r
16+
}
17+
return l && r
2218
}

solution/2300-2399/2331.Evaluate Boolean Binary Tree/Solution.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,11 @@
1515
*/
1616
class Solution {
1717
public boolean evaluateTree(TreeNode root) {
18-
return dfs(root);
19-
}
20-
21-
private boolean dfs(TreeNode root) {
22-
if (root.left == null && root.right == null) {
18+
if (root.left == null) {
2319
return root.val == 1;
2420
}
25-
boolean l = dfs(root.left), r = dfs(root.right);
26-
if (root.val == 2) {
27-
return l || r;
28-
}
29-
return l && r;
21+
boolean l = evaluateTree(root.left);
22+
boolean r = evaluateTree(root.right);
23+
return root.val == 2 ? l || r : l && r;
3024
}
3125
}

solution/2300-2399/2331.Evaluate Boolean Binary Tree/Solution.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,8 @@
66
# self.right = right
77
class Solution:
88
def evaluateTree(self, root: Optional[TreeNode]) -> bool:
9-
def dfs(root):
10-
if root.left is None and root.right is None:
11-
return bool(root.val)
12-
l, r = dfs(root.left), dfs(root.right)
13-
return (l or r) if root.val == 2 else (l and r)
14-
15-
return dfs(root)
9+
if root.left is None:
10+
return bool(root.val)
11+
l = self.evaluateTree(root.left)
12+
r = self.evaluateTree(root.right)
13+
return l or r if root.val == 2 else l and r

0 commit comments

Comments
 (0)