概念:
中序遍历中的下一个结点就是后继结点,中序遍历中的前一个结点就是前驱结点。
step:
1)若一个结点有右子树,则后继结点就是左子树的最左边的结点
2)若一个结点无右子树,则就往上找,直到往上找的那个结点为他父亲的左儿子,
则该父亲为后继结点,否则为NULL
代码:
class Node {
public:
int data;
Node* left;
Node* right;
Node* parent;
Node(int da) {
data = da;
}
};
Node* getSucessionNode(Node* node) {
if (node == NULL)
return NULL;
if (node->right != NULL) {//有右子树,就往下寻找最左侧的结点
return getLeftMost(node);
}else {//无右子树,就往上串
Node* parent = node->parent;
while (parent != NULL && parent->left != node) {//当前结点有父亲且是父亲的左儿子
node = parent;
parent = parent->parent;
}
return parent;
}
}
Node* getLeftMost(Node* head) {
if (head == NULL)
return NULL;
while (head->left != NULL) {//一直往左找左儿子
head = head->right;
}
return head;
}