题目简介
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路
该题目主要考察对二叉树中序遍历规律的理解和分类讨论思想。二叉树的中序遍历情况主要分为三种结点:
- 情况1:存在右子树的结点。那么此时中序下,肯定访问以右孩子为根结点的子二叉树中,中序遍历的第一个结点,直接找最左侧的结点即可
- 情况2:不存在右子树,但是该结点是父结点的坐孩子,那么直接返回父结点即可
- 情况3:不存在右子树,但是是父结点的右孩子,此时这种情况参照图片:
AC代码
class Solution {
public:
TreeLinkNode* GetNext (TreeLinkNode* pNode) {
if (pNode == nullptr) {
return nullptr;
}
if (pNode->right != nullptr) { // 情况1
TreeLinkNode* node = pNode->right;
while (node->left != nullptr) {
node = node->left;
}
return node;
} else if (pNode->right == nullptr && // 情况2
pNode->next != nullptr &&
pNode->next->left == pNode) {
return pNode->next;
} else { // 情况3
TreeLinkNode* par = pNode->next;
TreeLinkNode* cur = pNode;
while (par != nullptr && cur != par->left) {
cur = par;
par = par->next;
}
return par;
}
}
};