Node *findInOrderSuccessor(Node *root, Node *target){
Stack<Node *> s;
Node *cur = root;
Node *prev = NULL;
while(true){
while(cur) {
s.push(cur);
cur = cur->left;
}
if (s.empty()){
break;
} else {
cur = s.pop();
}
if (prev == target) {
return cur;
}
prev = cur;
cur = cur->right;
}
return NULL;
}
另外一种原创解法,假设输入参数只有一个,所求的为输入参数的下一个节点
Node* findRightTreeMostLeftChild(Node *pNode)
{
pNode *pTmp = pNode;
while (pNode->leftChild != NULL)
{
pTmp = pNode;
pNode = pNode->leftChild;
}
return pTmp;
}
Node* findInorderSucc(Node* pNode)
{
if (pNode->parent == NULL || pNode->rightChild != NULL)
{
return findRightTreeMostLeftChild(pNode->rightChild);
}
if (pNode = pNode->parent->leftChild)
{
return pNode->parent;
}
while (pNode = pNode->parent->rightChild)
{
pNode = pNode->parent;
}
return pNode;
}