Skip to content

Commit d70fc7d

Browse files
committed
feat: add solutions to lc problem: No.0919
No.0919.Complete Binary Tree Inserter
1 parent 3f09a68 commit d70fc7d

File tree

6 files changed

+605
-30
lines changed

6 files changed

+605
-30
lines changed

solution/0900-0999/0919.Complete Binary Tree Inserter/README.md

Lines changed: 204 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
<li>给定节点或插入节点的每个值都在&nbsp;<code>0</code>&nbsp;到&nbsp;<code>5000</code>&nbsp;之间。</li>
4444
</ol>
4545

46-
4746
## 解法
4847

4948
<!-- 这里可写通用的实现逻辑 -->
@@ -55,15 +54,219 @@
5554
<!-- 这里可写当前语言的特殊实现逻辑 -->
5655

5756
```python
57+
# Definition for a binary tree node.
58+
# class TreeNode:
59+
# def __init__(self, val=0, left=None, right=None):
60+
# self.val = val
61+
# self.left = left
62+
# self.right = right
63+
class CBTInserter:
64+
65+
def __init__(self, root: TreeNode):
66+
self.tree = []
67+
q = collections.deque([root])
68+
while q:
69+
n = len(q)
70+
for _ in range(n):
71+
node = q.popleft()
72+
self.tree.append(node)
73+
if node.left:
74+
q.append(node.left)
75+
if node.right:
76+
q.append(node.right)
77+
78+
def insert(self, val: int) -> int:
79+
pidx = (len(self.tree) - 1) >> 1
80+
node = TreeNode(val=val)
81+
self.tree.append(node)
82+
if self.tree[pidx].left is None:
83+
self.tree[pidx].left = node
84+
else:
85+
self.tree[pidx].right = node
86+
return self.tree[pidx].val
5887

88+
def get_root(self) -> TreeNode:
89+
return self.tree[0]
90+
91+
92+
# Your CBTInserter object will be instantiated and called as such:
93+
# obj = CBTInserter(root)
94+
# param_1 = obj.insert(val)
95+
# param_2 = obj.get_root()
5996
```
6097

6198
### **Java**
6299

63100
<!-- 这里可写当前语言的特殊实现逻辑 -->
64101

65102
```java
103+
/**
104+
* Definition for a binary tree node.
105+
* public class TreeNode {
106+
* int val;
107+
* TreeNode left;
108+
* TreeNode right;
109+
* TreeNode() {}
110+
* TreeNode(int val) { this.val = val; }
111+
* TreeNode(int val, TreeNode left, TreeNode right) {
112+
* this.val = val;
113+
* this.left = left;
114+
* this.right = right;
115+
* }
116+
* }
117+
*/
118+
class CBTInserter {
119+
private List<TreeNode> tree;
120+
121+
public CBTInserter(TreeNode root) {
122+
tree = new ArrayList<>();
123+
Deque<TreeNode> q = new ArrayDeque<>();
124+
q.offerLast(root);
125+
while (!q.isEmpty()) {
126+
TreeNode node = q.pollFirst();
127+
tree.add(node);
128+
if (node.left != null) {
129+
q.offerLast(node.left);
130+
}
131+
if (node.right != null) {
132+
q.offerLast(node.right);
133+
}
134+
}
135+
}
136+
137+
public int insert(int val) {
138+
int pidx = (tree.size() - 1) >> 1;
139+
TreeNode node = new TreeNode(val);
140+
tree.add(node);
141+
if (tree.get(pidx).left == null) {
142+
tree.get(pidx).left = node;
143+
} else {
144+
tree.get(pidx).right = node;
145+
}
146+
return tree.get(pidx).val;
147+
}
148+
149+
public TreeNode get_root() {
150+
return tree.get(0);
151+
}
152+
}
153+
154+
/**
155+
* Your CBTInserter object will be instantiated and called as such:
156+
* CBTInserter obj = new CBTInserter(root);
157+
* int param_1 = obj.insert(val);
158+
* TreeNode param_2 = obj.get_root();
159+
*/
160+
```
161+
162+
### **C++**
163+
164+
```cpp
165+
/**
166+
* Definition for a binary tree node.
167+
* struct TreeNode {
168+
* int val;
169+
* TreeNode *left;
170+
* TreeNode *right;
171+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
172+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
173+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
174+
* };
175+
*/
176+
class CBTInserter {
177+
public:
178+
vector<TreeNode*> tree;
179+
180+
CBTInserter(TreeNode* root) {
181+
queue<TreeNode*> q;
182+
q.push(root);
183+
while (!q.empty())
184+
{
185+
auto node = q.front();
186+
q.pop();
187+
tree.push_back(node);
188+
if (node->left) q.push(node->left);
189+
if (node->right) q.push(node->right);
190+
}
191+
}
192+
193+
int insert(int val) {
194+
int pidx = tree.size() - 1 >> 1;
195+
TreeNode* node = new TreeNode(val);
196+
tree.push_back(node);
197+
if (!tree[pidx]->left) tree[pidx]->left = node;
198+
else tree[pidx]->right = node;
199+
return tree[pidx]->val;
200+
}
201+
202+
TreeNode* get_root() {
203+
return tree[0];
204+
}
205+
};
206+
207+
/**
208+
* Your CBTInserter object will be instantiated and called as such:
209+
* CBTInserter* obj = new CBTInserter(root);
210+
* int param_1 = obj->insert(val);
211+
* TreeNode* param_2 = obj->get_root();
212+
*/
213+
```
214+
215+
### **Go**
216+
217+
```go
218+
/**
219+
* Definition for a binary tree node.
220+
* type TreeNode struct {
221+
* Val int
222+
* Left *TreeNode
223+
* Right *TreeNode
224+
* }
225+
*/
226+
type CBTInserter struct {
227+
tree []*TreeNode
228+
}
229+
230+
func Constructor(root *TreeNode) CBTInserter {
231+
var q []*TreeNode
232+
var tree []*TreeNode
233+
q = append(q, root)
234+
for len(q) > 0 {
235+
node := q[0]
236+
tree = append(tree, node)
237+
q = q[1:]
238+
if node.Left != nil {
239+
q = append(q, node.Left)
240+
}
241+
if node.Right != nil {
242+
q = append(q, node.Right)
243+
}
244+
}
245+
return CBTInserter{tree}
246+
}
247+
248+
func (this *CBTInserter) Insert(val int) int {
249+
pidx := (len(this.tree) - 1) >> 1
250+
node := &TreeNode{Val: val}
251+
this.tree = append(this.tree, node)
252+
if this.tree[pidx].Left == nil {
253+
this.tree[pidx].Left = node
254+
} else {
255+
this.tree[pidx].Right = node
256+
}
257+
return this.tree[pidx].Val
258+
}
259+
260+
func (this *CBTInserter) Get_root() *TreeNode {
261+
return this.tree[0]
262+
}
66263
264+
/**
265+
* Your CBTInserter object will be instantiated and called as such:
266+
* obj := Constructor(root);
267+
* param_1 := obj.Insert(val);
268+
* param_2 := obj.Get_root();
269+
*/
67270
```
68271

69272
### **...**

0 commit comments

Comments
 (0)