平衡二叉树的建立(下)

在理解了几种基本类型之后,我们就要知道怎么用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型,然后调用对应的函数即可。

 

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

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

 

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/csdnnmbdybb/article/details/83065468
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞