平衡二叉树增删改查java实现

二叉树排序树的操作

二叉树又称排序树,是一种对数据操作达到logn的数量级的结构。
在理想情况下每种操作可以达到这种效果。但是在现实中往往做不到这样。尤其是当数据有序插入或者数据量的分化程度大时复杂度会大大增加。
这时候出现了平衡二叉树。作用是使二叉树的形状接近于矮胖。这样对树的各种操作就可以达到logn。

二叉树的基本操作不再赘述。主要讲一下怎么在操作完一次后完成树的平衡。
以插入为例,当插入一个结点之后。自此节点的插入结点向上遍历,发现不平衡结点就对于不平衡结点旋转至平衡。直到遍历到根节点。
四种不平衡的四种旋转。

  • 在失衡结点的左孩子的左子树上插入 - - -LL右旋
  • 在失衡结点的左孩子的右子树上插入 - - -RL旋转
  • 在失衡结点的右孩子的左子树上插入 - - -LR右旋
  • 在失衡结点的右孩子的右子树上插入 - - -RR右旋
    因为这里情况有些复杂,建议读者在纸上画画进行条件判断来确定是哪种旋转。

另一种思路是每次插入都是递归插入,每次更新高度差。如果有不平衡就进行旋转。无论是插入删除还是更新都是在递归的过程中平衡整棵树。代码会大大减少
代码如下

public class Demo05{

    public static void main(String[] args) {
        AVLNode root = null;
        for(int i = 1; i <= 10; i++){
            root = insert(root, i);
        }
        insert(root, 2);
        inOrder(root);
        System.out.println();
//      System.out.println("height: " + (root.height + 1) + " " + (int)Math.ceil(Math.log(10)/ Math.log(2))); // 树的高度为叶子节点的最大深度加上1(根节点为第一层)
        remove(root, 4);
        inOrder(root);
    }

    public static AVLNode insert(AVLNode root, int data) {
        if (root == null) {
            root = new AVLNode(data);
            return root;
        }
        if (data <= root
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是二增删改查的C语言代码示例。 首先,我们需要定义二的结构体: ```c struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; ``` 接下来,我们分别实现的增、删、改、查操作: 1. 增加节点 ```c struct TreeNode* insertNode(struct TreeNode* root, int val) { if (!root) { struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } if (val < root->val) { root->left = insertNode(root->left, val); } else if (val > root->val) { root->right = insertNode(root->right, val); } return root; } ``` 2. 删除节点 ```c struct TreeNode* deleteNode(struct TreeNode* root, int key) { if (!root) { return NULL; } if (root->val == key) { if (!root->left) { struct TreeNode* tmp = root->right; free(root); return tmp; } else if (!root->right) { struct TreeNode* tmp = root->left; free(root); return tmp; } else { struct TreeNode* p = root->right; while (p->left) { p = p->left; } root->val = p->val; root->right = deleteNode(root->right, p->val); } } else if (root->val > key) { root->left = deleteNode(root->left, key); } else { root->right = deleteNode(root->right, key); } return root; } ``` 3. 修改节点 ```c struct TreeNode* modifyNode(struct TreeNode* root, int oldVal, int newVal) { root = deleteNode(root, oldVal); root = insertNode(root, newVal); return root; } ``` 4. 查找节点 ```c struct TreeNode* searchNode(struct TreeNode* root, int val) { if (!root || root->val == val) { return root; } if (root->val > val) { return searchNode(root->left, val); } else { return searchNode(root->right, val); } } ``` 以上就是二增删改查的C语言代码示例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值