-
Notifications
You must be signed in to change notification settings - Fork 0
/
diameter_of_a_binary_tree_test.dart
72 lines (55 loc) · 1.64 KB
/
diameter_of_a_binary_tree_test.dart
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
import 'dart:collection';
import 'dart:math' as math;
import 'package:test/test.dart';
int diameter(Node root) {
final stack1 = DoubleLinkedQueue<Node>()..add(root);
final stack2 = DoubleLinkedQueue<Node>();
var node = root;
while (stack1.isNotEmpty) {
node = stack1.pop();
if (node.left != null) stack1.push(node.left!);
if (node.right != null) stack1.push(node.right!);
stack2.push(node);
}
var maxDiameter = 0;
final heights = <Node, int>{};
int getHeight(Node? node) => node == null ? 0 : heights[node] ?? 1;
while (stack2.isNotEmpty) {
node = stack2.pop();
var leftHeight = getHeight(node.left);
var rightHeight = getHeight(node.right);
maxDiameter = math.max(leftHeight + rightHeight, maxDiameter);
heights[node] = math.max(leftHeight, rightHeight) + 1;
}
return maxDiameter;
}
extension MinimalistStack<E> on Queue<E> {
void push(E value) => addLast(value);
E pop() => removeLast();
}
int diameterRecursive(Node root) {
var maxDiameter = 0;
int height(Node? node) {
if (node == null) return 0;
var leftHeight = height(node.left);
var rightHeight = height(node.right);
maxDiameter = math.max(leftHeight + rightHeight, maxDiameter);
return math.max(leftHeight, rightHeight) + 1;
}
height(root);
return maxDiameter;
}
class Node {
const Node(this.value, [this.left, this.right]);
final int value;
final Node? left;
final Node? right;
@override
String toString() => '$Node($value, $left, $right)';
}
void main() {
test('leetcode', () {
expect(diameter(Node(1, Node(2, Node(4), Node(5)), Node(3))), 3);
expect(diameter(Node(1, Node(2))), 1);
});
}