依据昨天制定的计划和同学的建议今天我把Java和数据结构结合起来,根据分析网上的代码完成了一个简单的平衡二叉树的Java程序,具体代码如下:

//经过修改后的代码如下
package com.company;
import java.util.Stack;
class Node{
    int data;
    Node left;
    Node right;
    public Node(int data) {
        this.data = data;
    }//结点
}
public class AVL {

    Node root;
    public void add(int value) {
        this.add(value, this.root);
    }
    public void add(int value, Node node) {
        if(this.root == null) {
            this.root = new Node(value);
        }else {
            //大于放在右边、判断
            if(value > node.data) {
                if(node.right == null) {
                    node.right = new Node(value);
                }else {
                    add(value, node.right);
                }
            }else {//小于等于放在左边、判断
                if(node.left == null) {
                    node.left = new Node(value);
                }else {
                    add(value, node.left);
                }
            }
        }//二叉树子结点判断
        //在添加节点时刻就进行判断旋转
        if(getHeight(root.right) - getHeight(root.left) > 1) {
            if(getHeight(root.right.left) > getHeight(root.right.right)) {
                rightRotate(root.right);
            }
            leftRotate(root);
            return;
        }
        if(getHeight(root.left) - getHeight(root.right) > 1) {
            if(getHeight(root.left.right) > getHeight(root.left.left)) {
                leftRotate(root.left);
            }
            rightRotate(root);
        }
    }
    //得到树的高度
    public int getHeight(Node node) {
        if(node == null) {
            return 0;
        }else {
            return Math.max(node.left == null ? 0 : getHeight(node.left), node.right == null ? 0 : getHeight(node.right)) + 1;
        }
    }
    //左旋转
    public void leftRotate(Node node) {
        Node temp = node.right;
        node.right = temp.left;
        temp.left = node;
        this.root = temp;
    }
    //右旋转
    public void rightRotate(Node node) {
        Node temp = node.left;
        node.left = temp.right;
        temp.right = node;
        this.root = temp;
    }
    //中序遍历用来输出平衡后的二叉树
    public void inOrder() {
        Node temp = this.root;
        Stack<Node> stack = new Stack<Node>();
        while(!stack.isEmpty() || temp != null) {
            if(temp != null) {
                stack.push(temp);
                temp = temp.left;
            }else {
                temp = stack.pop();
                System.out.print(temp.data + " ");
                temp = temp.right;
            }
        }
    }
    public static void main(String[] args) {//主类
        // TODO Auto-generated method stub

        int[] arr = {10,12,8,9,7,6};
        AVL avl = new AVL();
        for(int i=0; i<arr.length; i++) {
            avl.add(arr[i]);
        }
        avl.inOrder();System.out.println();
        System.out.println(avl.getHeight(avl.root));

        System.out.println(avl.root.data);
    }
}

  

posted on 2021-12-30 20:37  辰逸1  阅读(35)  评论(0编辑  收藏  举报