zoukankan      html  css  js  c++  java
  • LeetCode——将二叉搜索树变平衡?

    Q:给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。
    如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。
    如果有多种构造方法,请你返回任意一种。

    输入:root = [1,null,2,null,3,null,4,null,null]
    输出:[2,1,3,null,null,null,4]
    解释:这不是唯一的正确答案,[3,1,4,null,2,null,null] 也是一个可行的构造方案。

    A:
    看着这个题标记的“中等”,我死活也不相信要去手撕AVL旋转……
    所以我使用了广大人民都会使用的,中序转数组转平衡二叉树。

        private ArrayList<Integer> in;
    
        public TreeNode balanceBST(TreeNode root) {
            if (root == null || (root.left == null && root.right == null))
                return root;
            in = new ArrayList<>();
            inorder(root);
            TreeNode res = createTree(in, 0, in.size() - 1);
            return res;
        }
    
        private TreeNode createTree(ArrayList<Integer> in, int start, int end) {//创建平衡二叉搜索树
            if (start > end)
                return null;
            else if (start == end)
                return new TreeNode(in.get(start));
            else {
                int mid = (start + end) / 2;
                TreeNode root = new TreeNode(in.get(mid));
                root.left = createTree(in, start, mid - 1);
                root.right = createTree(in, mid + 1, end);
                return root;
            }
        }
    
        private void inorder(TreeNode root) {//中序遍历
            if (root == null)
                return;
            inorder(root.left);
            in.add(root.val);
            inorder(root.right);
        }
    

    如果真的需要有手撕的需要,请移步:手撕AVL树,我不管,我就是要旋转
    (找时间撕一遍。)

  • 相关阅读:
    深入理解Linux修改hostname
    Linux开发环境必备十大开发工具
    管理员必备的几个Linux系统监控工具
    Solaris&&QNX® Neutrino®&&OpenVMS&&FreeBSD&&AIX
    ansible来了
    Cobbler系统安装备用链接
    Web安全
    在Eclipse/STS中使用EclEmma进行覆盖率检查
    C#中使用扩展方法
    Winform中Textbox的使用
  • 原文地址:https://www.cnblogs.com/xym4869/p/12760304.html
Copyright © 2011-2022 走看看