@@ -326,146 +326,116 @@ func main() {
326
326
327
327
> 找到二叉树的最大宽度
328
328
329
- ``` Java
330
- package class07 ;
331
-
332
- import java.util.HashMap ;
333
- import java.util.LinkedList ;
334
- import java.util.Queue ;
329
+ ``` Go
330
+ package main
335
331
336
- public class Code06_TreeMaxWidth {
332
+ import " math "
337
333
338
- public static class Node {
339
- public int value;
340
- public Node left;
341
- public Node right;
334
+ type Node struct {
335
+ // 二叉树节点上的值
336
+ Val int
337
+ // 左孩子
338
+ Left *Node
339
+ // 右孩子
340
+ Right *Node
341
+ }
342
342
343
- public Node (int data ) {
344
- this . value = data;
345
- }
343
+ // MaxWidthUseMap 给定二叉树头节点,找到该二叉树的最大宽度,借助map结构实现
344
+ func (head *Node ) MaxWidthUseMap () int {
345
+ if head == nil {
346
+ return 0
346
347
}
348
+ hd := head
349
+ queue := make ([]*Node, 0 )
350
+ queue = append (queue, hd)
347
351
348
- // 方法1使用map
349
- public static int maxWidthUseMap (Node head ) {
350
- if (head == null ) {
351
- return 0 ;
352
- }
353
- Queue<Node > queue = new LinkedList<> ();
354
- queue. add(head);
355
- // key(节点) 在 哪一层,value
356
- HashMap<Node , Integer > levelMap = new HashMap<> ();
357
- // head在第一层
358
- levelMap. put(head, 1 );
359
- // 当前你正在统计哪一层的宽度
360
- int curLevel = 1 ;
361
- // 当前层curLevel层,宽度目前是多少
362
- int curLevelNodes = 0 ;
363
- // 用来保存所有层的最大值,也就是最大宽度
364
- int max = 0 ;
365
- while (! queue. isEmpty()) {
366
- Node cur = queue. poll();
367
- int curNodeLevel = levelMap. get(cur);
368
- // 当前节点的左孩子不为空,队列加入左孩子,层数在之前层上加1
369
- if (cur. left != null ) {
370
- levelMap. put(cur. left, curNodeLevel + 1 );
371
- queue. add(cur. left);
372
- }
373
- // 当前节点的右孩子不为空,队列加入右孩子,层数也变为当前节点的层数加1
374
- if (cur. right != null ) {
375
- levelMap. put(cur. right, curNodeLevel + 1 );
376
- queue. add(cur. right);
377
- }
378
- // 当前层等于正在统计的层数,不结算
379
- if (curNodeLevel == curLevel) {
380
- curLevelNodes++ ;
381
- } else {
382
- // 新的一层,需要结算
383
- // 得到目前为止的最大宽度
384
- max = Math . max(max, curLevelNodes);
385
- curLevel++ ;
386
- // 结算后,当前层节点数设置为1
387
- curLevelNodes = 1 ;
388
- }
352
+ // map的Key:节点 map的value:节点属于哪一层
353
+ levelMap := make (map [*Node]int , 0 )
354
+ // 头节点head属于第一层
355
+ levelMap[hd] = 1
356
+ // 当前正在统计那一层的宽度
357
+ curLevel := 1
358
+ // 当前curLevel层,宽度目前是多少
359
+ curLevelNodes := 0
360
+ // 用来保存所有层的最大宽度的值
361
+ max := 0
362
+ for len (queue) != 0 {
363
+ cur := queue[0 ]
364
+ queue = queue[1 :]
365
+ curNodeLevel := levelMap[cur]
366
+ // 当前节点的左孩子不为空,队列加入左孩子,层数在之前层上加1
367
+ if cur.Left != nil {
368
+ levelMap[cur.Left ] = curNodeLevel + 1
369
+ queue = append (queue, cur.Left )
389
370
}
390
- // 由于最后一层,没有新的一层去结算,所以这里单独结算最后一层
391
- max = Math . max(max, curLevelNodes);
392
- return max;
393
- }
394
-
395
- // 方法2不使用map
396
- public static int maxWidthNoMap (Node head ) {
397
- if (head == null ) {
398
- return 0 ;
371
+ // 当前节点的右孩子不为空,队列加入右孩子,层数也变为当前节点的层数加1
372
+ if cur.Right != nil {
373
+ levelMap[cur.Right ] = curNodeLevel + 1
374
+ queue = append (queue, cur.Right )
399
375
}
400
- Queue<Node > queue = new LinkedList<> ();
401
- queue. add(head);
402
- // 当前层,最右节点是谁,初始head的就是本身
403
- Node curEnd = head;
404
- // 如果有下一层,下一层最右节点是谁
405
- Node nextEnd = null ;
406
- // 全局最大宽度
407
- int max = 0 ;
408
- // 当前层的节点数
409
- int curLevelNodes = 0 ;
410
- while (! queue. isEmpty()) {
411
- Node cur = queue. poll();
412
- // 左边不等于空,加入左
413
- if (cur. left != null ) {
414
- queue. add(cur. left);
415
- // 孩子的最右节点暂时为左节点
416
- nextEnd = cur. left;
417
- }
418
- // 右边不等于空,加入右
419
- if (cur. right != null ) {
420
- queue. add(cur. right);
421
- // 如果有右节点,孩子层的最右要更新为右节点
422
- nextEnd = cur. right;
423
- }
424
- // 由于最开始弹出当前节点,那么该层的节点数加一
425
- curLevelNodes++ ;
426
- // 当前节点是当前层最右的节点,进行结算
427
- if (cur == curEnd) {
428
- // 当前层的节点和max进行比较,计算当前最大的max
429
- max = Math . max(max, curLevelNodes);
430
- // 即将进入下一层,重置下一层节点为0个节点
431
- curLevelNodes = 0 ;
432
- // 当前层的最右,直接更新为找出来的下一层最右
433
- curEnd = nextEnd;
434
- }
376
+ // 当前层等于正在统计的层数,不结算
377
+ if curNodeLevel == curLevel {
378
+ curLevelNodes ++
379
+ } else {
380
+ // 新的一层,需要结算
381
+ // 得到目前为止的最大宽度
382
+ max = int (math.Max (float64 (max), float64 (curLevelNodes)))
383
+ curLevel++
384
+ // 结算后,当前层节点数设置为1
385
+ curLevelNodes = 1
435
386
}
436
- return max;
437
387
}
388
+ // 由于最后一层,没有新的一层去结算,所以这里单独结算最后一层
389
+ max = int (math.Max (float64 (max), float64 (curLevelNodes)))
390
+ return max
391
+ }
438
392
439
- // for test
440
- public static Node generateRandomBST (int maxLevel , int maxValue ) {
441
- return generate(1 , maxLevel, maxValue);
393
+ // MaxWidthNoMap 给定二叉树头节点,找到该二叉树的最大宽度,不借助map实现
394
+ func (head *Node ) MaxWidthNoMap () int {
395
+ if head == nil {
396
+ return 0
442
397
}
443
398
444
- // for test
445
- public static Node generate (int level , int maxLevel , int maxValue ) {
446
- if (level > maxLevel || Math . random() < 0.5 ) {
447
- return null ;
448
- }
449
- Node head = new Node ((int ) (Math . random() * maxValue));
450
- head. left = generate(level + 1 , maxLevel, maxValue);
451
- head. right = generate(level + 1 , maxLevel, maxValue);
452
- return head;
453
- }
399
+ hd := head
400
+ queue := make ([]*Node, 0 )
401
+ queue = append (queue, hd)
454
402
455
- public static void main (String [] args ) {
456
- int maxLevel = 10 ;
457
- int maxValue = 100 ;
458
- int testTimes = 1000000 ;
459
- for (int i = 0 ; i < testTimes; i++ ) {
460
- Node head = generateRandomBST(maxLevel, maxValue);
461
- if (maxWidthUseMap(head) != maxWidthNoMap(head)) {
462
- System . out. println(" Oops!" );
463
- }
403
+ // 当前层,最右节点是谁,初始head的就是本身
404
+ curEnd := head
405
+ // 如果有下一层,下一层最右节点是谁
406
+ var nextEnd *Node = nil
407
+ // 全局最大宽度
408
+ max := 0
409
+ // 当前层的节点数
410
+ curLevelNodes := 0
411
+ for len (queue) != 0 {
412
+ cur := queue[0 ]
413
+ queue = queue[1 :]
414
+ // 左边不等于空,加入左
415
+ if cur.Left != nil {
416
+ queue = append (queue, cur.Left )
417
+ // 孩子的最右节点暂时为左节点
418
+ nextEnd = cur.Left
464
419
}
465
- System . out. println(" finish!" );
466
-
467
- }
468
-
420
+ // 右边不等于空,加入右
421
+ if cur.Right != nil {
422
+ queue = append (queue, cur.Right )
423
+ // 如果有右节点,孩子层的最右要更新为右节点
424
+ nextEnd = cur.Right
425
+ }
426
+ // 由于最开始弹出当前节点,那么该层的节点数加一
427
+ curLevelNodes++
428
+ // 当前节点是当前层最右的节点,进行结算
429
+ if cur == curEnd {
430
+ // 当前层的节点和max进行比较,计算当前最大的max
431
+ max = int (math.Max (float64 (max), float64 (curLevelNodes)))
432
+ // 即将进入下一层,重置下一层节点为0个节点
433
+ curLevelNodes = 0
434
+ // 当前层的最右,直接更新为找出来的下一层最右
435
+ curEnd = nextEnd
436
+ }
437
+ }
438
+ return max
469
439
}
470
440
```
471
441
0 commit comments