@@ -501,6 +501,82 @@ function pos(root) {
501
501
}
502
502
```
503
503
504
+ #### 中序遍历的前驱后继节点
505
+
506
+ 实现这个算法的前提是节点有一个 ` parent ` 的指针指向父节点,根节点指向 ` null ` 。
507
+
508
+ <div align =" center " ><img src =" https://user-gold-cdn.xitu.io/2018/4/24/162f61ad8e8588b7?w=682&h=486&f=png&s=41027 " width =400 /></div >
509
+
510
+ 如图所示,该树的中序遍历结果是 ` 4, 2, 5, 1, 6, 3, 7 `
511
+
512
+ ##### 前驱节点
513
+
514
+ 对于节点 ` 2 ` 来说,他的前驱节点就是 ` 4 ` ,按照中序遍历原则,可以得出以下结论
515
+
516
+ 1 . 如果选取的节点的左节点不为空,就找该左节点最右的节点。对于节点 ` 1 ` 来说,他有左节点 ` 2 ` ,那么节点 ` 2 ` 的最右节点就是 ` 5 `
517
+ 2 . 如果左节点为空,且目标节点是父节点的右节点,那么前驱节点为父节点。对于节点 ` 5 ` 来说,没有左节点,且是节点 ` 2 ` 的右节点,所以节点 ` 2 ` 是前驱节点
518
+ 3 . 如果左节点为空,且目标节点是父节点的左节点,向上寻找到第一个是父节点的右节点的节点。对于节点 ` 6 ` 来说,没有左节点,且是节点 ` 3 ` 的左节点,所以向上寻找到节点 ` 1 ` ,发现节点 ` 3 ` 是节点 ` 1 ` 的右节点,所以节点 ` 1 ` 是节点 ` 6 ` 的前驱节点
519
+
520
+ 以下是算法实现
521
+
522
+ ``` js
523
+ function predecessor (node ) {
524
+ if (! node) return
525
+ // 结论 1
526
+ if (node .left ) {
527
+ return getRight (node .left )
528
+ } else {
529
+ let parent = node .parent
530
+ // 结论 2 3 的判断
531
+ while (parent && parent .right === node) {
532
+ node = parent
533
+ parent = node .parent
534
+ }
535
+ return parent
536
+ }
537
+ }
538
+ function getRight (node ) {
539
+ if (! node) return
540
+ node = node .right
541
+ while (node) node = node .right
542
+ return node
543
+ }
544
+ ```
545
+
546
+ ##### 后继节点
547
+
548
+ 对于节点 ` 2 ` 来说,他的后继节点就是 ` 5 ` ,按照中序遍历原则,可以得出以下结论
549
+
550
+ 1 . 如果有右节点,就找到该右节点的最左节点。对于节点 ` 1 ` 来说,他有右节点 ` 3 ` ,那么节点 ` 3 ` 的最左节点就是 ` 6 `
551
+ 2 . 如果没有右节点,就向上遍历直到找到一个节点是父节点的左节点。对于节点 ` 5 ` 来说,没有右节点,就向上寻找到节点 ` 2 ` ,该节点是父节点 ` 1 ` 的左节点,所以节点 ` 1 ` 是后继节点
552
+
553
+ 以下是算法实现
554
+
555
+ ``` js
556
+ function successor (node ) {
557
+ if (! node) return
558
+ // 结论 1
559
+ if (node .right ) {
560
+ return getLeft (node .right )
561
+ } else {
562
+ // 结论 2
563
+ let parent = node .parent
564
+ // 判断 parent 为空
565
+ while (parent && parent .left === node) {
566
+ node = parent
567
+ parent = node .parent
568
+ }
569
+ return parent
570
+ }
571
+ }
572
+ function getLeft (node ) {
573
+ if (! node) return
574
+ node = node .left
575
+ while (node) node = node .left
576
+ return node
577
+ }
578
+ ```
579
+
504
580
#### 树的深度
505
581
506
582
** 树的最大深度** :该题目来自 [ Leetcode] ( https://leetcode.com/problems/maximum-depth-of-binary-tree/description/ ) ,题目需要求出一颗二叉树的最大深度
0 commit comments