平衡二叉树的建立(下)

在理解了几种基本类型之后,我们就要知道怎么用4个基础操作了

node *insert(node *root, int val) {
    if(root == NULL) {
        root = new node();
        root->val = val;
        root->left = root->right = NULL;
    } else if(val < root->val) {
        root->left = insert(root->left, val);
        if(getHeight(root->left) - getHeight(root->right) == 2)
            root = val < root->left->val ? rotateRight(root) : rotateLeftRight(root);
    } else {
        root->right = insert(root->right, val);
        if(getHeight(root->left) - getHeight(root->right) == -2)
            root = val > root->right->val ? rotateLeft(root) : rotateRightLeft(root);
    }
    return root;
}

首先我们要有一个计算高度的函数getHeight(node*);

树的算法大部分都是递归的,我们很喜欢这样做,但是如果稍微递归的复杂那么一点,可能就不那么直观了。

其实好好看看,也不难理解,就是判断插入点与当前根节点的大小关系,这里形成递归。

然后就是要判断这个操作会不会使得当前根节点的子树不平衡,如果不平衡,那么判断属于4种类型中的哪一种;这4种在开始判断插入点与当前点的大小关系时已经分成两类了,就是L-L,L-R型 R-R,R-L型,然后调用对应的函数即可。

 

最后,一定要有个直观的画面在脑子里,这样才是真的理解了,记住了,所有的算法都是这样,你能够在脑子里把过程模拟一遍才是真的记住了。人的想象力是很丰富的,要充分利用呀。

最好的检验方法是自己画图,然后像我一样写一篇博客,试试自己能不能解释清楚,如果自己觉得没问题,那就可以了。至于读者看不看得懂,那就看运气了。。。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值