中序遍历过程中,一个结点的下一个结点是该结点的后继结点,而一个结点的前一个结点叫该结点的前驱结点,
比如说下面这个二叉树,中序遍历的结果是4、2、5、1、6、3、7
那么4的后继结点就是2,1的前驱结点就是5
结点x如果有右子树的话,它的后继结点就是它右子树上最左的结点,
x没有右子树,那么谁的左子树是以x结尾的,谁就是x的后继结点
class successorNode{
private:
class Node{
public:
int value;
Node*left;
Node*right;
Node*parent;
Node(int data){
this->value=data;
}
};
Node* getSuccessorNode(Node *node){
if(node!=NULL){
return node;
}
if(node->right!=NULL)
//一个结点如果有右子树的话,找右子树中最左的结点
return getLeftMost(node->right);
else{
//如果没有右字数,就看它是谁的左子树的最后一个结点
Node *parent=node->parent;
while(parent!=NULL&&parent->left!=node){
node=parent;
parent=node->parent;
}
return parent;
}
}
Node* getLeftMost(Node *node){
if(node==NULL)
return node;
while(node->left!=NULL)
node=node->left;
return node;
}
};
对应的也能找到前驱结点