二叉树的下一个结点
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路: 若节点有右节点, 返回右节点的左子节点的左子节点直至叶子节点
若节点没有右节点, 则返回该结点的父节点支路的右节点
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if (nullptr == pNode) {
return nullptr;
}
TreeLinkNode *ret = nullptr;
if (nullptr != pNode->right) { // 如果有右节点
TreeLinkNode *pRight = pNode->right;
while (nullptr != pRight->left) { // 找到右节点的左节点
pRight = pRight->left;
}
ret = pRight;
}
else if (nullptr != pNode->next){ // 没有右节点
TreeLinkNode *pCurrent = pNode;
TreeLinkNode *pParent = pNode->next; // 当前节点的父节点
while ((nullptr != pParent) && (pParent->right == pCurrent)) { // 直至父节点的左子节点
pCurrent = pParent;
pParent = pParent->next;
}
ret = pParent;
}
return ret;
}
};
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};