题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路
- 回顾中序遍历的顺序
- 如果一个节点的右子树不为空,那么下一个节点是该节点右子树的最左叶子;
- 否则(右子树为空),沿父节点向上直到找到某个节点是其父节点的左孩子,那么该父节点就是下一个节点
code
/*
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) {
if (pNode == nullptr)
return nullptr;
if(pNode->right != nullptr) {
auto p = pNode->right;
while(p->left != nullptr)
p = p->left;
return p;
}
else {
auto p = pNode; // 当前节点
while(p->next != nullptr) { // 当前节点的父节点不为空
if (p->next->left == p) // 当前节点是其父节点的左海子
return p->next; // 那么下一个节点就是当前节点的父节点
p = p->next;
}
}
return nullptr; // 当前节点是根节点且没有右孩子,即没有下一个节点
}
};