• 有序链表转换二叉搜索树


    问题描述:

    给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

    本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

    示例:

    给定的有序链表: [-10, -3, 0, 5, 9],
    
    一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
    
          0
         / 
       -3   9
       /   /
     -10  5

    解题思路:

    将链表先转为数组,之后方法与将有序数组转换为二叉搜索树相同。

    实现代码:

        private static TreeNode test(int[] nums, int lo, int hi) {
    
            if (lo < hi) return null;
            if (lo == hi) return new TreeNode(nums[hi]);
    
            int mid = (lo + hi) / 2;
            TreeNode node = new TreeNode(nums[mid]);
            node.left = test(nums, lo, mid-1);
            node.right = test(nums, mid+1, hi);
    
            return node;
        }
    
        public static TreeNode listToBST(ListNode head) {
    
            // 将链表转为数组
            ListNode temp = head;
            int len = 0;
            while (temp != null) {
                len++;
                temp = temp.next;
                }
            int[] nums = new int[len];
            temp = head;
            len = 0;
            while (temp != null) {
                nums[len++] = temp.val;
                temp = temp.next;
            }
            return test(nums, 0, nums.length);
        }

     方法2:

    直接使用链表生成二叉搜索树。

    在递归生成二叉树时,先求左子树,再根节点,最后右子树。

    实现代码:

        private static TreeNode build(int lo, int hi) {
    
            if (lo > hi) return null;
    
            int mid = (lo + hi) / 2;
            // 先求左子树
            TreeNode left = build(lo, mid-1);
    
            // 构造节点
            TreeNode node = new TreeNode(list.val);
            list = list.next;
    
            // 右子树
            TreeNode right = build(mid+1, hi);
    
            node.left = left;
            node.right = right;
            if (mid == (len-1)/2) root = node;
            return node;
        }
        public static TreeNode toBST(ListNode head) {
            // 计算链表总长度
            list = head;
            while (head != null) {
                len++;
                head = head.next;
            }
            build(0, len-1);
            return root;
        }
  • 相关阅读:
    tcp_wrapper
    iptables
    Openstack_后端存储平台Ceph
    Openstack_O版(otaka)部署_Horizon部署
    Openstack_O版(otaka)部署_网络服务Neutron部署
    Openstack_O版(otaka)部署_Nova部署
    Openstack_O版(otaka)部署_镜像服务glance部署
    Openstack_O版(otaka)部署_认证服务keystone部署
    Openstack_O版(otaka)部署_准备环境和依赖软件
    模块
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9310708.html
Copyright © 2020-2023  润新知