zoukankan      html  css  js  c++  java
  • 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;
            }
        }
     
    }
  • 相关阅读:
    KTorrent 2.1
    Krusader-双面板文件治理器
    VirtualBox 1.3.4
    QEMU 0.9.0 & QEMU Accelerator 1.3.0pre10
    Sweep:音频编辑器材
    USBSink-优盘同步备份东西
    玩转 MPlayer(1)
    玩转 MPlayer(2)
    活动目录之迁移
    再学 GDI+[26]: TGPPen 画笔对齐 SetAlignment
  • 原文地址:https://www.cnblogs.com/wgy1/p/10475197.html
Copyright © 2011-2022 走看看