题目描述:
给定一个二叉树的其中的一个结点(这个节点不一定是root节点),请找出在中序遍历顺序下,该节点的下一个结点;注意,结点不仅包含指向左右子结点的指针,同时包含指向父结点的指针。
解题思路:
node节点有右孩子,下一个节点就是以node节点的右孩子为根的子树中的最左下节点。如下图:node=8,它的下一个结点为12。
node节点没有右孩子时,node节点是其父节点的左孩子,那么下一个节点就是父节点。如下图,节点8的下一个结点是节点12。
node节点没有右孩子时,node节点是其父节点的右孩子,如下图,结点14 的下一个结点是 结点16。
Demo:
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode){
TreeLinkNode *pNext = nullptr;
// 如果一个结点有右子树
if (pNode->right != nullptr){
TreeLinkNode *pRight = pNode->right;
// 一直找到最左结点,即为下一个结点
while (pRight->left != nullptr)
pRight = pRight->left;
pNext = pRight;
}else if (pNode->next != nullptr){ // 当前结点没有右子树
// 保存当前结点和它的父结点
TreeLinkNode *pCurrent = pNode;
TreeLinkNode *pParent = pNode->next;
// 如果当前结点是父结点的右子结点,则沿着父结点向上遍历,
// 直到当前结点是父结点的左子结点,那么下一个结点就是父结点
while (pParent != nullptr && pCurrent == pParent->right){
pCurrent = pParent;
pParent = pParent->next;
}
// 如果当前结点是父结点的左子结点,那么下一个结点就是父结点
pNext = pParent;
}
return pNext;
}
};