Skip to content

Commit 4730274

Browse files
committed
前驱后继节点
1 parent 3e4be6b commit 4730274

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

Algorithm/algorithm-ch.md

+76
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,82 @@ function pos(root) {
501501
}
502502
```
503503

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+
504580
#### 树的深度
505581

506582
**树的最大深度**:该题目来自 [Leetcode](https://leetcode.com/problems/maximum-depth-of-binary-tree/description/),题目需要求出一颗二叉树的最大深度

0 commit comments

Comments
 (0)