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树,我不管,我就是要旋转
    (找时间撕一遍。)

  • 相关阅读:
    前端数组去重
    前端三栏布局
    JS运行三部曲(预编译)
    前端常用开发工具
    前端性能监控你会监控哪些数据? 如何做?
    H5与客户端交互的方式有哪些? 怎么做?
    http协议的状态码400,401,403,404,500,502,503,301,302等常见网页错误代码
    随笔记录
    Browser Events 常用浏览器事件
    MYSQL 索引的优点
  • 原文地址:https://www.cnblogs.com/xym4869/p/12760304.html
Copyright © 2011-2022 走看看