//查找中序遍历下x结点的后继,后继是大于key[x]的最小的结点 node *Tree_Successor(node *x) { //如果有右孩子 if(x->right != NULL) //右子树中的最小值 return Tree_Minimum(x->right); //如果x的右子树为空且x有后继y,那么y是x的最低祖先结点,且y的左儿子也是 node *y = x->p; while(y != NULL && x == y->right) { x = y; y = y->p; } return y; }
//查找二叉查找树中节点x的前驱节点,返回指向该节点的指针 //在查找过程中,如果节点x左子树不为空,那么返回左子树的最大节点即可 //如果节点x的左子树为空,那么前驱节点为x的某一个祖先节点的父节点,而且该祖先节点是作为其父节点的右儿子 Tree tree_predecessor(Tree x) { if (x->left_child != null) return tree_maxmum(x->left_child); Tree y = x->parent;while (y != NULL && x == y->left_child) { x = y; y = y->parent; } return y; }
中序 前驱最容易情形之一:5寻前驱 4
复杂情形之一:11寻前驱 10
中序后继容易情形之一:5寻后继 6
复杂情形之一:9寻前驱 10