剑指8:二叉树的下一个节点

传送门

nowcoder

题目描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。
注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

C++ 代码 - nowcoder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
分析可知:

1.二叉树为空,则返回空;
2.如果一个节点有右子树,那么它的下一个节点就是它的右子树的最左子节点。
3.如果一个节点没有右子树,如果该节点是其父节点的左子节点,那么它的下一个节点就是它的父节点;
如果一个节点没有右子树,并且该节点是其父节点的右子节点,那么向上遍历直到找到一个是它父节点的左子节点的节点,返回其父节点。
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
if (pNode == nullptr) return nullptr;

// 若当前节点有右子树,则返回右子树的最左子节点
if (pNode->right != nullptr) {
pNode = pNode->right;
while (pNode->left != nullptr) {
pNode = pNode->left;
}
return pNode;
}

// 若当前节点没有右子树
while (pNode->next != nullptr) {
TreeLinkNode* pRoot = pNode->next;
if (pRoot->left == pNode) {
return pRoot;
}
pNode = pNode->next;
}
return nullptr;
}
};

剑指8:二叉树的下一个节点
https://lcf163.github.io/2021/01/29/剑指8:二叉树的下一个节点/
作者
乘风的小站
发布于
2021年1月29日
许可协议