二叉搜索树的前驱和后继节点

前驱节点val值小于该节点val值并且值最大的节点
后继节点val值大于该节点val值并且值最小的节点

BST.png

前驱节点
1 如果x存在左孩子,则"x的前驱结点"为 "以其左孩子为根的子树的最大结点"
(例如:节点10,前驱就是8);
2 如果x没有左孩子。则x有以下两种可能;
2.1 x是"一个右孩子",则"x的前驱结点"为 "它的父结点";

前驱节点.png

图片有个错误,节点8的前驱是节点7


2.2 x是"一个左孩子",则查找"x的最低的父结点,并且该父结点要具有右孩子",找到的这个"最低的父结点"就是"x的前驱结点";


前驱节点.png

问题:什么是最低的父节点?
答:我的理解是,要找前驱元素,肯定是找一个有右孩子的父亲节点,并且这个父亲节点的右孩子中一定能找到当前节点.
上图中,节点6没有左孩子,并且是个左孩子.有右孩子的父亲节点有5和10,但是只有在5的右孩子中能找到节点6.


后继节点
1 如果x存在右孩子,则"x的后继结点"为 "以其右孩子为根的子树的最小结点"
(例如:节点5,后继就是6);
2 如果x没有右孩子。则x有以下两种可能;
2.1 x是"一个左孩子",则"x的后继结点"为 "它的父结点";
2.2 x是"一个左孩子",则查找"x的最低的父结点,并且该父结点要具有左孩子",找到的这个"最低的父结点"就是"x的前驱结点";


BST.png

问题:什么是最低的父节点?
答:我的理解是,要找后继元素,肯定是找一个有左孩子的父亲节点,并且这个父亲节点的左孩子中一定能找到当前节点.
上图中,节点7没有右孩子,并且是右左孩子.有左孩子的父亲节点有5和10,但是只有在10的左孩子中能找到节点7.所以说节点7的后继是节点10

//前驱元素
//节点val值小于该节点val值并且值最大的节点
Node *predecessor(Node *node) {
    Node *ret = NULL;
    // 如果x存在左孩子,则"x的前驱结点"为 "以其左孩子为根的子树的最大结点"。
    if(node->left != NULL) {
        Node *r = node->left;
        while(r->right) {
            r = r->right;
        }
        ret = r;
    } else {
        // 如果x没有左孩子。则x有以下两种可能:
        // (01) x是"一个右孩子",则"x的前驱结点"为 "它的父结点"。
        // (01) x是"一个左孩子",则查找"x的最低的父结点,并且该父结点要具有右孩子",找到的这个"最低的父结点"就是"x的前驱结点"。
        ret = node->parent;
        while ((ret != NULL) && (node == ret->left)) {
            node = ret;
            ret = ret->parent;
        }
    }
    return ret;
}

//后继元素
//节点val值大于该节点val值并且值最小的节点
Node *successor(Node *node) {
    Node *ret = NULL;
    if(node->right != NULL) {
        Node *l = node->right;
        while(l->left) {
            l = l->left;
        }
        ret = l;
    } else {
        // 如果x没有右孩子。则x有以下两种可能:
        // (01) x是"一个左孩子",则"x的后继结点"为 "它的父结点"。
        // (02) x是"一个右孩子",则查找"x的最低的父结点,并且该父结点要具有左孩子",找到的这个"最低的父结点"就是"x的后继结点"。
        ret = node->parent;
        while ((ret != NULL) && (node == ret->right)) {
            node = ret;
            ret = ret->parent;
        }
    }
    return ret;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 如需转载, 请咨询作者, 并且注明出处.有任何问题, 可以关注我的微博: coderwhy, 或者添加我的微信: ...
    coderwhy阅读 8,987评论 12 35
  • 目录 1、什么是树 2、相关术语 3、二叉树 3.1、二叉树的类型 3.2、二叉树的性质 3.3、二叉树的结构 3...
    我哈啊哈啊哈阅读 2,576评论 0 10
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,142评论 0 12
  • 下午和两位如新直销员接触了下! 她们对自己的产品认知比一般传统零售行业里的销售员,对自己所销售的产品认知深度很多,...
    juan子阅读 274评论 1 1
  • 记得翻阅资料的时候看到网上有一张关于骑士的搞怪照片,几个身穿奥特曼服装的骑士在街上摆出几个经典的Pose,广告语的...
    红曙阅读 202评论 0 1