1
+ package binary_search
2
+
3
+ class CountCompleteTreeNodesKotlin222 {
4
+ class TreeNode (var `val `: Int ) {
5
+ var left: TreeNode ? = null
6
+ var right: TreeNode ? = null
7
+ }
8
+
9
+ fun countNodes (root : TreeNode ? ): Int {
10
+ if (root == null ) {
11
+ return 0
12
+ }
13
+ return 1 + countNodes(root?.left) + countNodes(root?.right)
14
+ }
15
+ /*
16
+ fun countNodes(root: TreeNode?): Int {
17
+ if (root == null) {
18
+ return 0
19
+ }
20
+ var level = 0
21
+ var current = root
22
+ while (current!!.left != null) {
23
+ level++
24
+ current = current.left
25
+ }
26
+ return search(root, level)
27
+ }
28
+
29
+ private fun search(root: TreeNode, level: Int): Int {
30
+ var left = 1.shl(level)
31
+ var right = 1.shl(level + 1) - 1
32
+ while (left + 1 < right) {
33
+ val mid = left + (right - left) / 2
34
+ when {
35
+ isNotNull(root, mid, level) -> left = mid
36
+ else -> right = mid
37
+ }
38
+ }
39
+ return when {
40
+ isNotNull(root, right, level) -> right
41
+ isNotNull(root, left, level) -> left
42
+ else -> -1
43
+ }
44
+ }
45
+
46
+ private fun isNotNull(root: TreeNode, target: Int, level: Int): Boolean {
47
+ var result: TreeNode? = root
48
+ var start = 1.shl(level)
49
+ var end = 1.shl(level + 1) - 1
50
+ var currentLevel = level
51
+ while (currentLevel > 0) {
52
+ val mid = start + (end - start).shr(1)
53
+ if (target > mid) {
54
+ result = result?.right
55
+ start = mid
56
+ } else {
57
+ result = result?.left
58
+ end = mid
59
+ }
60
+ currentLevel--
61
+ }
62
+ return result != null
63
+ }
64
+
65
+ /*
66
+ private fun isNotNull(root: TreeNode, target: Int): Boolean {
67
+ var current = target
68
+ val stack = Stack<Int>()
69
+ while (current != 1) {
70
+ stack.push(current % 2)
71
+ current = current.shr(1)
72
+ }
73
+ var result: TreeNode? = root
74
+ while (stack.size != 0) {
75
+ when (stack.pop()) {
76
+ 1 -> result = result?.right
77
+ 0 -> result = result?.left
78
+ }
79
+ }
80
+ return result != null
81
+ }
82
+ */
83
+ }
84
+
85
+
86
+ fun main() {
87
+ val solution = CountCompleteTreeNodesKotlin222()
88
+
89
+ val test = TreeNode(1)
90
+ val test2 = TreeNode(2)
91
+ test.left = test2
92
+ println(solution.countNodes(test))
93
+
94
+ val root = TreeNode(1)
95
+ val node2 = TreeNode(2)
96
+ val node3 = TreeNode(3)
97
+ val node4 = TreeNode(4)
98
+ val node5 = TreeNode(5)
99
+ val node6 = TreeNode(6)
100
+ val node7 = TreeNode(7)
101
+ val node8 = TreeNode(8)
102
+ val node9 = TreeNode(9)
103
+ val node10 = TreeNode(10)
104
+ val node11 = TreeNode(11)
105
+ val node12 = TreeNode(12)
106
+ root.left = node2
107
+ root.right = node3
108
+ node2.left = node4
109
+ node2.right = node5
110
+ node3.left = node6
111
+ node3.right = node7
112
+ node4.left = node8
113
+ node4.right = node9
114
+ node5.left = node10
115
+ node5.right = node11
116
+ node6.left = node12
117
+
118
+ println(solution.countNodes(root))
119
+ }
120
+ */
0 commit comments