算法情景分析 二叉排序树 前驱+后缀 测试用列

//查找中序遍历下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; }

 

 

 

 

 

360软件小助手截图20120818123211

 

中序 前驱最容易情形之一:5寻前驱 4

复杂情形之一:11寻前驱 10

 

中序后继容易情形之一:5寻后继 6

复杂情形之一:9寻前驱 10


 
 

posted @ 2012-08-18 12:39  os66  阅读(1100)  评论(0编辑  收藏  举报