Skip to content

Commit f5a316a

Browse files
committedJul 23, 2022
feat: add solutions to lc/lcof2 problems
* lc No.0919 & lcof2 No.043.Complete Binary Tree Inserter
1 parent 4fe765d commit f5a316a

File tree

13 files changed

+423
-187
lines changed

13 files changed

+423
-187
lines changed
 

‎lcof2/剑指 Offer II 043. 往完全二叉树添加节点/README.md

+107-46
Original file line numberDiff line numberDiff line change
@@ -65,37 +65,36 @@
6565
# self.left = left
6666
# self.right = right
6767
class CBTInserter:
68-
6968
def __init__(self, root: TreeNode):
7069
self.tree = []
7170
q = deque([root])
7271
while q:
73-
n = len(q)
74-
for _ in range(n):
72+
for _ in range(len(q)):
7573
node = q.popleft()
7674
self.tree.append(node)
7775
if node.left:
7876
q.append(node.left)
7977
if node.right:
8078
q.append(node.right)
8179

82-
def insert(self, val: int) -> int:
83-
pidx = (len(self.tree) - 1) >> 1
84-
node = TreeNode(val=val)
80+
def insert(self, v: int) -> int:
81+
pid = (len(self.tree) - 1) >> 1
82+
node = TreeNode(v)
8583
self.tree.append(node)
86-
if self.tree[pidx].left is None:
87-
self.tree[pidx].left = node
84+
p = self.tree[pid]
85+
if p.left is None:
86+
p.left = node
8887
else:
89-
self.tree[pidx].right = node
90-
return self.tree[pidx].val
88+
p.right = node
89+
return p.val
9190

9291
def get_root(self) -> TreeNode:
9392
return self.tree[0]
9493

9594

9695
# Your CBTInserter object will be instantiated and called as such:
9796
# obj = CBTInserter(root)
98-
# param_1 = obj.insert(val)
97+
# param_1 = obj.insert(v)
9998
# param_2 = obj.get_root()
10099
```
101100

@@ -125,31 +124,32 @@ class CBTInserter {
125124
public CBTInserter(TreeNode root) {
126125
tree = new ArrayList<>();
127126
Deque<TreeNode> q = new ArrayDeque<>();
128-
q.offerLast(root);
127+
q.offer(root);
129128
while (!q.isEmpty()) {
130129
TreeNode node = q.pollFirst();
131130
tree.add(node);
132131
if (node.left != null) {
133-
q.offerLast(node.left);
132+
q.offer(node.left);
134133
}
135134
if (node.right != null) {
136-
q.offerLast(node.right);
135+
q.offer(node.right);
137136
}
138137
}
139138
}
140-
141-
public int insert(int val) {
142-
int pidx = (tree.size() - 1) >> 1;
143-
TreeNode node = new TreeNode(val);
139+
140+
public int insert(int v) {
141+
int pid = (tree.size() - 1) >> 1;
142+
TreeNode node = new TreeNode(v);
144143
tree.add(node);
145-
if (tree.get(pidx).left == null) {
146-
tree.get(pidx).left = node;
144+
TreeNode p = tree.get(pid);
145+
if (p.left == null) {
146+
p.left = node;
147147
} else {
148-
tree.get(pidx).right = node;
148+
p.right = node;
149149
}
150-
return tree.get(pidx).val;
150+
return p.val;
151151
}
152-
152+
153153
public TreeNode get_root() {
154154
return tree.get(0);
155155
}
@@ -158,7 +158,7 @@ class CBTInserter {
158158
/**
159159
* Your CBTInserter object will be instantiated and called as such:
160160
* CBTInserter obj = new CBTInserter(root);
161-
* int param_1 = obj.insert(val);
161+
* int param_1 = obj.insert(v);
162162
* TreeNode param_2 = obj.get_root();
163163
*/
164164
```
@@ -182,8 +182,7 @@ public:
182182
vector<TreeNode*> tree;
183183

184184
CBTInserter(TreeNode* root) {
185-
queue<TreeNode*> q;
186-
q.push(root);
185+
queue<TreeNode*> q{{root}};
187186
while (!q.empty())
188187
{
189188
auto node = q.front();
@@ -193,16 +192,17 @@ public:
193192
if (node->right) q.push(node->right);
194193
}
195194
}
196-
197-
int insert(int val) {
198-
int pidx = tree.size() - 1 >> 1;
199-
TreeNode* node = new TreeNode(val);
195+
196+
int insert(int v) {
197+
int pid = tree.size() - 1 >> 1;
198+
TreeNode* node = new TreeNode(v);
200199
tree.push_back(node);
201-
if (!tree[pidx]->left) tree[pidx]->left = node;
202-
else tree[pidx]->right = node;
203-
return tree[pidx]->val;
200+
TreeNode* p = tree[pid];
201+
if (!p->left) p->left = node;
202+
else p->right = node;
203+
return p->val;
204204
}
205-
205+
206206
TreeNode* get_root() {
207207
return tree[0];
208208
}
@@ -211,7 +211,7 @@ public:
211211
/**
212212
* Your CBTInserter object will be instantiated and called as such:
213213
* CBTInserter* obj = new CBTInserter(root);
214-
* int param_1 = obj->insert(val);
214+
* int param_1 = obj->insert(v);
215215
* TreeNode* param_2 = obj->get_root();
216216
*/
217217
```
@@ -232,9 +232,8 @@ type CBTInserter struct {
232232
}
233233
234234
func Constructor(root *TreeNode) CBTInserter {
235-
var q []*TreeNode
236-
var tree []*TreeNode
237-
q = append(q, root)
235+
q := []*TreeNode{root}
236+
tree := []*TreeNode{}
238237
for len(q) > 0 {
239238
node := q[0]
240239
tree = append(tree, node)
@@ -249,16 +248,17 @@ func Constructor(root *TreeNode) CBTInserter {
249248
return CBTInserter{tree}
250249
}
251250
252-
func (this *CBTInserter) Insert(val int) int {
253-
pidx := (len(this.tree) - 1) >> 1
254-
node := &TreeNode{Val: val}
251+
func (this *CBTInserter) Insert(v int) int {
252+
pid := (len(this.tree) - 1) >> 1
253+
node := &TreeNode{Val: v}
255254
this.tree = append(this.tree, node)
256-
if this.tree[pidx].Left == nil {
257-
this.tree[pidx].Left = node
255+
p := this.tree[pid]
256+
if p.Left == nil {
257+
p.Left = node
258258
} else {
259-
this.tree[pidx].Right = node
259+
p.Right = node
260260
}
261-
return this.tree[pidx].Val
261+
return p.Val
262262
}
263263
264264
func (this *CBTInserter) Get_root() *TreeNode {
@@ -268,11 +268,72 @@ func (this *CBTInserter) Get_root() *TreeNode {
268268
/**
269269
* Your CBTInserter object will be instantiated and called as such:
270270
* obj := Constructor(root);
271-
* param_1 := obj.Insert(val);
271+
* param_1 := obj.Insert(v);
272272
* param_2 := obj.Get_root();
273273
*/
274274
```
275275

276+
### **JavaScript**
277+
278+
```js
279+
/**
280+
* Definition for a binary tree node.
281+
* function TreeNode(val, left, right) {
282+
* this.val = (val===undefined ? 0 : val)
283+
* this.left = (left===undefined ? null : left)
284+
* this.right = (right===undefined ? null : right)
285+
* }
286+
*/
287+
/**
288+
* @param {TreeNode} root
289+
*/
290+
var CBTInserter = function (root) {
291+
this.tree = [];
292+
const q = [root];
293+
while (q.length) {
294+
const node = q.shift();
295+
this.tree.push(node);
296+
if (node.left) {
297+
q.push(node.left);
298+
}
299+
if (node.right) {
300+
q.push(node.right);
301+
}
302+
}
303+
};
304+
305+
/**
306+
* @param {number} v
307+
* @return {number}
308+
*/
309+
CBTInserter.prototype.insert = function (v) {
310+
const pid = (this.tree.length - 1) >> 1;
311+
const node = new TreeNode(v);
312+
this.tree.push(node);
313+
const p = this.tree[pid];
314+
if (!p.left) {
315+
p.left = node;
316+
} else {
317+
p.right = node;
318+
}
319+
return p.val;
320+
};
321+
322+
/**
323+
* @return {TreeNode}
324+
*/
325+
CBTInserter.prototype.get_root = function () {
326+
return this.tree[0];
327+
};
328+
329+
/**
330+
* Your CBTInserter object will be instantiated and called as such:
331+
* var obj = new CBTInserter(root)
332+
* var param_1 = obj.insert(v)
333+
* var param_2 = obj.get_root()
334+
*/
335+
```
336+
276337
### **...**
277338

278339
```

‎lcof2/剑指 Offer II 043. 往完全二叉树添加节点/Solution.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ class CBTInserter {
1414
vector<TreeNode*> tree;
1515

1616
CBTInserter(TreeNode* root) {
17-
queue<TreeNode*> q;
18-
q.push(root);
17+
queue<TreeNode*> q{{root}};
1918
while (!q.empty())
2019
{
2120
auto node = q.front();
@@ -26,13 +25,14 @@ class CBTInserter {
2625
}
2726
}
2827

29-
int insert(int val) {
30-
int pidx = tree.size() - 1 >> 1;
31-
TreeNode* node = new TreeNode(val);
28+
int insert(int v) {
29+
int pid = tree.size() - 1 >> 1;
30+
TreeNode* node = new TreeNode(v);
3231
tree.push_back(node);
33-
if (!tree[pidx]->left) tree[pidx]->left = node;
34-
else tree[pidx]->right = node;
35-
return tree[pidx]->val;
32+
TreeNode* p = tree[pid];
33+
if (!p->left) p->left = node;
34+
else p->right = node;
35+
return p->val;
3636
}
3737

3838
TreeNode* get_root() {
@@ -43,6 +43,6 @@ class CBTInserter {
4343
/**
4444
* Your CBTInserter object will be instantiated and called as such:
4545
* CBTInserter* obj = new CBTInserter(root);
46-
* int param_1 = obj->insert(val);
46+
* int param_1 = obj->insert(v);
4747
* TreeNode* param_2 = obj->get_root();
4848
*/

‎lcof2/剑指 Offer II 043. 往完全二叉树添加节点/Solution.go

+11-11
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@ type CBTInserter struct {
1111
}
1212

1313
func Constructor(root *TreeNode) CBTInserter {
14-
var q []*TreeNode
15-
var tree []*TreeNode
16-
q = append(q, root)
14+
q := []*TreeNode{root}
15+
tree := []*TreeNode{}
1716
for len(q) > 0 {
1817
node := q[0]
1918
tree = append(tree, node)
@@ -28,16 +27,17 @@ func Constructor(root *TreeNode) CBTInserter {
2827
return CBTInserter{tree}
2928
}
3029

31-
func (this *CBTInserter) Insert(val int) int {
32-
pidx := (len(this.tree) - 1) >> 1
33-
node := &TreeNode{Val: val}
30+
func (this *CBTInserter) Insert(v int) int {
31+
pid := (len(this.tree) - 1) >> 1
32+
node := &TreeNode{Val: v}
3433
this.tree = append(this.tree, node)
35-
if this.tree[pidx].Left == nil {
36-
this.tree[pidx].Left = node
34+
p := this.tree[pid]
35+
if p.Left == nil {
36+
p.Left = node
3737
} else {
38-
this.tree[pidx].Right = node
38+
p.Right = node
3939
}
40-
return this.tree[pidx].Val
40+
return p.Val
4141
}
4242

4343
func (this *CBTInserter) Get_root() *TreeNode {
@@ -47,6 +47,6 @@ func (this *CBTInserter) Get_root() *TreeNode {
4747
/**
4848
* Your CBTInserter object will be instantiated and called as such:
4949
* obj := Constructor(root);
50-
* param_1 := obj.Insert(val);
50+
* param_1 := obj.Insert(v);
5151
* param_2 := obj.Get_root();
5252
*/

‎lcof2/剑指 Offer II 043. 往完全二叉树添加节点/Solution.java

+12-11
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,30 @@ class CBTInserter {
1919
public CBTInserter(TreeNode root) {
2020
tree = new ArrayList<>();
2121
Deque<TreeNode> q = new ArrayDeque<>();
22-
q.offerLast(root);
22+
q.offer(root);
2323
while (!q.isEmpty()) {
2424
TreeNode node = q.pollFirst();
2525
tree.add(node);
2626
if (node.left != null) {
27-
q.offerLast(node.left);
27+
q.offer(node.left);
2828
}
2929
if (node.right != null) {
30-
q.offerLast(node.right);
30+
q.offer(node.right);
3131
}
3232
}
3333
}
3434

35-
public int insert(int val) {
36-
int pidx = (tree.size() - 1) >> 1;
37-
TreeNode node = new TreeNode(val);
35+
public int insert(int v) {
36+
int pid = (tree.size() - 1) >> 1;
37+
TreeNode node = new TreeNode(v);
3838
tree.add(node);
39-
if (tree.get(pidx).left == null) {
40-
tree.get(pidx).left = node;
39+
TreeNode p = tree.get(pid);
40+
if (p.left == null) {
41+
p.left = node;
4142
} else {
42-
tree.get(pidx).right = node;
43+
p.right = node;
4344
}
44-
return tree.get(pidx).val;
45+
return p.val;
4546
}
4647

4748
public TreeNode get_root() {
@@ -52,6 +53,6 @@ public TreeNode get_root() {
5253
/**
5354
* Your CBTInserter object will be instantiated and called as such:
5455
* CBTInserter obj = new CBTInserter(root);
55-
* int param_1 = obj.insert(val);
56+
* int param_1 = obj.insert(v);
5657
* TreeNode param_2 = obj.get_root();
5758
*/

0 commit comments

Comments
 (0)
Please sign in to comment.