Java 平衡二叉树 实现

Posted currentTimeMillis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 平衡二叉树 实现相关的知识,希望对你有一定的参考价值。

记录一下某次使用平衡二叉树。

注:二叉树概念

1、二叉树、完全二叉树、满二叉树、平衡二叉树区别

二叉树: 除了叶子节点外,每个节点只有两个分支,左子树和右子树,每个节点的最大度数为2

满二叉树:除了叶结点外每一个结点都有左右子叶 叶结点都处在最底层的二叉树。

完全二叉树:只有最下面的两层结点度小于2,并且最下面一层的结点都集中再该层最左边的若干位置的二叉树

-- 满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树

平衡二叉树(AVL树):树的左右子树的高度差不超过1的数,空树也是平衡二叉树的一种。

 

一、首先要有两个实体类:

ListNode.java 链表树类

package test;

public class ListNode {
    Object val;
    ListNode next;
    ListNode(Object x) { val = x; }
}

 

TreeNode.java 二叉树类

package test;

public class TreeNode {
    Object val;
    TreeNode left;
    TreeNode right;
    TreeNode(Object x) { val = x; }
}

 

二、TreeNodeTest.java 测试类 int 数据类型

package test;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;

public class TreeNodeTest {
    
    TreeNode treeNode =  null;
    
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        new TreeNodeTest().test();
    }
    
    public void test() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
        System.out.println("================begin :"+sdf.format(new Date()));
        
        List list = new ArrayList();
        for(int i = 1 ; i< 10; i++) {
            list.add( 3*i );
        }
        System.out.println("=======add 10000 list :"+sdf.format(new Date())+" | value :"+ list);
        
        Collections.sort(list);
        System.out.println("Collections.sort list :"+sdf.format(new Date())+" | value :"+ list);
         
        ListNode head = new ListNode(list.get(0));
        for(int i = 1; i < list.size(); i++) {
            addTreeNode(head, new ListNode(list.get(i)));
        }
        System.out.println("arraylist to ListNode :"+sdf.format(new Date()) );
        
        treeNode = sortedListToBST(head);
        System.out.println("======sortedListToBST :"+sdf.format(new Date()) );
    
        Object object = selectTreeNode(treeNode, 11);
        System.out.println("=======selectTreeNode :"+sdf.format(new Date())+" | return object val:"+object);
        
        clearTreeNode(treeNode);
        System.out.println("======sortedListToBST :"+sdf.format(new Date()) );
    }
    
    // list 按照设定字段排序
    public void sortList(List<Map<String, String>> list, String name) {
        Collections.sort(list, new Comparator<Map<String, String>>() {
            public int compare(Map<String, String> o1, Map<String, String> o2) {
                return (o1.get(name)).compareTo(o2.get(name));
            }
        });
    }
    
    // ListNode 转 TreeNode
    public TreeNode sortedListToBST(ListNode head)
    {
        if (null == head) return null;
        if (null == head.next)
        {
            return new TreeNode(head.val);
        }
        ListNode slow = head, fast = head.next.next;
        while (fast != null && fast.next != null)
        {
            fast = fast.next.next;
            slow = slow.next;
        }
        TreeNode node = new TreeNode(slow.next.val);
        node.right = sortedListToBST(slow.next.next);
        slow.next = null;
        node.left = sortedListToBST(head);
        return node;
    }
    
    // add listNode
    public ListNode addTreeNode(ListNode h1, ListNode h2)
    {
        if(h1.next == null) {
            h1.next = h2;
            return h1;
        }
        addTreeNode(h1.next, h2);
        return h1;
    }
    
    // 传入要查询的数据和对应要查询的二叉树
    public Object selectTreeNode(TreeNode node, int val) {
        
        if(Integer.parseInt(node.val.toString()) == val) {
            return node.val;
        }
        
        if(node.left == null && node.right == null) {
            if(Integer.parseInt(node.val.toString()) < val) {
                return node.val;
            }
            if(Integer.parseInt(node.val.toString()) > val) {
                return null;
            }
        }
        
        if(Integer.parseInt(node.val.toString()) > val && node.left != null) {
            return selectTreeNode(node.left, val);
        }
        
        if(Integer.parseInt(node.val.toString()) < val && node.right != null) {
            Object b = selectTreeNode(node.right, val);
            if(b == null) {
                return node.val;
            } else {
                return b;
            }
        }
        
        if(Integer.parseInt(node.val.toString()) > val) {
            return null;
        }
        
        return node.val;
    }
    
    // 销毁 TreeNode
    public void clearTreeNode(TreeNode node) {
        if(node != null) {
            if(node.left != null) clearTreeNode(node.left);
            if(node.right != null) clearTreeNode(node.right);
            node.val = null;
            node.left = null;
            node.right = null;
        }
    }
 
}

 

三、TreeNodeTest.java 测试类 list-map 数据类型

 

package test;

import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;

public class TreeNodeTest {
    
    TreeNode treeNode =  null;
    Map<String, String> map = null;
    String str = "{ "code": 200, "success": true, "message": "操作成功!", "data": [   { "dateTime": "1547438663507",     "deviceType": "4010304020302#溢满传感器",     "collectionTime": "1547437663507",     "mnc": "",     "dataType": "3",     "latitude": "",     "messageId": "",     "body": "{\"deviceType\":\"HLFWT\",\"waitQueue\":0,\"msgType\":3,\"alarm\":\"NORMAL\",\"deviceId\":\"00000001\",\"version\":\"V0.0.1\"}",     "cellid": "",     "productKey": "3eERaSscrDe",     "deviceId": "0000000001",     "version": "",     "lac": "",     "onLine": "1",     "dataTypeStr": "3",     "alarm": "",     "simNum": "",     "devTypeStr": "3eERaSscrDe",     "sn": "",     "devidStr": "0000000001",     "curMapType": "-1",     "direction": "",     "longitude": ""   },   {     "dateTime": "1547437692803",     "deviceType": "4010304020302#溢满传感器",     "collectionTime": "1547437692803",     "mnc": "",     "dataType": "3",     "latitude": "",     "messageId": "",     "body": "{\"deviceType\":\"HLFWT\",\"waitQueue\":0,\"msgType\":3,\"alarm\":\"NORMAL\",\"deviceId\":\"00000001\",\"version\":\"V0.0.1\"}",     "cellid": "",     "productKey": "3eERaSscrDe",     "deviceId": "0000000001",     "version": "",     "lac": "",     "onLine": "1",     "dataTypeStr": "3",     "alarm": "",     "simNum": "",     "devTypeStr": "3eERaSscrDe",     "sn": "",     "devidStr": "0000000001",     "curMapType": "-1",     "direction": "",     "longitude": ""   }]   }";
    
    
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        new TreeNodeTest().test();
    }
    
    public void test() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
        
        Map maps = (Map)JSON.parse(str);  
        
        List<Map<String, String>> list =  (List<Map<String, String>>) maps.get("data");
        System.out.println("data to list : "+list);
        
        sortList(list, "dateTime");
        System.out.println("data to list sort : "+list);
        
        ListNode head = new ListNode(list.get(0));
        for(int i = 1; i < list.size(); i++) {
            addTreeNode(head, new ListNode(list.get(i)));
        }
        System.out.println("arraylist to ListNode :"+sdf.format(new Date()));
        treeNode = sortedListToBST(head);
        System.out.println("======sortedListToBST :"+sdf.format(new Date()));
    
        Object object = selectTreeNode(treeNode, 1547437763517l);
        System.out.println("========selectTreeNode:"+sdf.format(new Date())+" | return object val:"+object);
        
        clearTreeNode(treeNode);
        System.out.println("======sortedListToBST :"+sdf.format(new Date()));
    }
    
    // list 按照设定字段排序
    public void sortList(List<Map<String, String>> list, String name) {
        Collections.sort(list, new Comparator<Map<String, String>>() {
            public int compare(Map<String, String> o1, Map<String, String> o2) {
                return (o1.get(name)).compareTo(o2.get(name));
            }
        });
    }
    
    // ListNode 转 TreeNode
    public TreeNode sortedListToBST(ListNode head)
    {
        if (null == head) return null;
        if (null == head.next)
        {
            return new TreeNode(head.val);
        }
        ListNode slow = head, fast = head.next.next;
        while (fast != null && fast.next != null)
        {
            fast = fast.next.next;
            slow = slow.next;
        }
        TreeNode node = new TreeNode(slow.next.val);
        node.right = sortedListToBST(slow.next.next);
        slow.next = null;
        node.left = sortedListToBST(head);
        return node;
    }
    
    // add listNode
    public ListNode addTreeNode(ListNode h1, ListNode h2)
    {
        if(h1.next == null) {
            h1.next = h2;
            return h1;
        }
        addTreeNode(h1.next, h2);
        return h1;
    }
    
    // 传入要查询的数据和对应要查询的二叉树  , 返回二叉树对应结点值
    public Object selectTreeNode(TreeNode node, long val) {
        map = (Map<String, String>) node.val;
        
        if(val == Long.parseLong(map.get("dateTime").toString())) {
            return node.val;
        }
        
        if(node.left == null && node.right == null) {
            if(Long.parseLong(map.get("dateTime").toString()) < val) {
                return node.val;
            }
            if(Long.parseLong(map.get("dateTime").toString()) > val) {
                return null;
            }
        }
        
        if(Long.parseLong(map.get("dateTime").toString()) > val && node.left != null) {
            return selectTreeNode(node.left, val);
        }
        
        if(Long.parseLong(map.get("dateTime").toString()) < val && node.right != null) {
            Object b = selectTreeNode(node.right, val);
            if(b == null) {
                return node.val;
            } else {
                return b;
            }
        }
        
        if(Long.parseLong(map.get("dateTime").toString()) > val) {
            return null;
        }
        
        return node.val;
    }
    
    // 销毁 TreeNode
    public void clearTreeNode(TreeNode node) {
        if(node != null) {
            if(node.left != null) clearTreeNode(node.left);
            if(node.right != null) clearTreeNode(node.right);
            node.val = null;
            node.left = null;
            node.right = null;
        }
    }
 
}

 

以上是关于Java 平衡二叉树 实现的主要内容,如果未能解决你的问题,请参考以下文章

java平衡二叉树的增加删除等基本操作和代码实现

Java 剑指offer(55-2) 平衡二叉树

java剑指offer55.平衡二叉树

平衡二叉树 AVL树结构详解 [Java实现]

平衡二叉树的java实现

java 递归实现平衡二叉树