AVLTree Java 实现

写在前面: 这是一份java实现代码,便于供自己以后参阅,笔者java功底弱,实现的只是一个demo没有很好的封装。

code

/**
 * 
 */
package oj;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

import com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector;

import sun.reflect.generics.tree.Tree;




/**
 * @author zouzhitao
 *
 */
public class Main {
    public final static int INF = 0x3f3f3f3f;
    public final static int MAXN = 100;
    public static Scanner in = new Scanner(new BufferedInputStream(System.in));
    public static avlTree tree = new avlTree();
    public static void main(String[] args) {
        int n=in.nextInt();
        while (n-->0) {
            tree.insert(in.nextInt());
        }
        System.out.println(tree.root.key);
    }
}

class Node{
    private int height;
    public Node left,right;
    public int key;
    public Node(int key) {
        super();
        this.key = key;
        height =1;
    }
    public Node() {
        super();
        height =1;
    }
    public static int height(Node node) {
        return node==null? 0 : node.height;
    }
    public int updateHeight() {
        return height = Math.max(height(this.left), height(this.right))+1;
    }
    public static int bf(Node node) {
        return node==null? 0:height(node.right)-height(node.left);
    }
}

class avlTree{
    public Node root;
    public int size;
    public avlTree() {
        super();
        size=0;
        root = null;
    }
    public avlTree(int val) {
        root = new Node(val);
        size++;
    }
    private Node rotateL(Node ptr) {
        Node subL = ptr;
        ptr = subL.right;
        subL.right = ptr.left;
        ptr.left = subL;
        subL.updateHeight();
        ptr.updateHeight();
        return ptr;
    }
    private Node rotateR(Node ptr) {
        Node subR = ptr;
        ptr = subR.left;
        subR.left = ptr.right;
        ptr.right = subR;
        subR.updateHeight();
        ptr.updateHeight();
        return ptr;
    }
    private Node rotateLR(Node ptr) {
        Node subL = ptr.left;
        Node subR = ptr;
        ptr = subL.right;
        subL.right = ptr.left;
        subR.left = ptr.right;
        ptr.left = subL;
        ptr.right = subR;
        subR.updateHeight();
        subL.updateHeight();
        ptr.updateHeight();
        return ptr;
    }
    private Node rotateRL(Node ptr) {
        Node subL = ptr;
        Node subR = ptr.right;
        ptr = subR.left;
        subL.right = ptr.left;
        subR.left = ptr.right;
        ptr.left = subL;
        ptr.right = subR;
        subL.updateHeight();
        subR.updateHeight();
        ptr.updateHeight();
        return ptr;
    }
    private Node insert(Node now,int val) {
        if(now.key>val){
            if(now.left==null)now.left = new Node(val);
            else now.left = insert(now.left, val);
        }else{
            if(now.right==null) now.right = new Node(val);
            else now.right =insert(now.right, val);
        }
        now.updateHeight();
        int bf = Node.bf(now);
        if(bf==2){
            int tmpBf = Node.bf(now.right);
            now = tmpBf==1?rotateL(now):rotateRL(now);
        }else if(bf==-2){
            int tmpBf = Node.bf(now.left);
            now = tmpBf==-1?rotateR(now):rotateLR(now);
        }
        return now;
    }
    public Node insert(int val) {
        if(root==null)root = new Node(val);
        else root = insert(root, val);
        size++;
        return root;
    }
}

教训

找了几次bug 才了解了java的引用,java中貌似没有 node * & tmp,这样的东西????每次涉及到引用的函数入口都必须手动返回函数中更改过的引用,然后在调用处重新赋值,e.g.:

root = insert(root, val);
private Node rotateR(Node ptr) {
        Node subR = ptr;
        ptr = subR.left;
        subR.left = ptr.right;
        ptr.right = subR;
        subR.updateHeight();
        ptr.updateHeight();
        return ptr;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值