将升序单链表/数组转换为平衡二叉树BST

给定一个单链表,其中的元素按升序排序,请将它转化成平衡二叉搜索树(BST)

 

递归:o(nlogn)

解题思路:

1.找到链表的中点mid,

2.记录mid前缀,断开链表

3.将mid放入到树中

4.递归head(左链表),mid.next(右链表)

import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */
public class Solution {
    /**
     *
     * @param head ListNode类
     * @return TreeNode类
     */
    //获取中间节点
    public ListNode getmid(ListNode head){
        ListNode slow=head;
        ListNode fast=head;
        ListNode pre_slow=null;//记录slow的前一个节点
        //快慢指针获取中点
        while(fast!=null&&fast.next!=null){
            pre_slow=slow;
            slow=slow.next;
            fast=fast.next.next;
        }
        if(pre_slow!=null)   pre_slow.next=null;//断开链表
        return slow;
    }
    public TreeNode sortedListToBST (ListNode head) {
        if(head==null){
            return null;
        }
        ListNode mid=this.getmid(head);
        //中间节点为树根节点
       TreeNode node=new TreeNode(mid.val);
       //如果只剩下一个节点,返回node
       if(head==mid){
           return node;
       }
       node.left=sortedListToBST(head);
       node.right=sortedListToBST(mid.next);
       return node;
    }
}

给出一个升序排序的数组,将其转化为平衡二叉搜索树(BST)

1.判空

2.递归左子树,右子树

import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
public class Solution {
    /**
     *
     * @param num int整型一维数组
     * @return TreeNode类
     */
    public TreeNode getBST(int[]num,int left,int right){
        if(num==null ||num.length<=0|| left>right){
            return null;
        }
//取中点
        int mid=left+(right-left+1)/2;
        //只有一个节点
        if(left==right){
            return new TreeNode(num[left]);
        }
        //根节点
        TreeNode root=new TreeNode(num[mid]) ;
        //递归左子树
        root.left=getBST(num,left,mid-1);
        //递归右子树
        root.right=getBST(num,mid+1,right);
        return root;
    }
    public TreeNode sortedArrayToBST (int[] num) {
        if(num==null ||num.length==0){
            return null;
        }
        return getBST(num,0,num.length-1);
    }
}

 

### 将数组转换为二叉树的算法及实现 将数组转换为二叉树是一种常见的数据结构操作,尤其是在处理平衡二叉搜索树BST)时更为重要。以下是关于该主题的具体说明: #### 方法概述 一种常见的方式是通过递归来构建二叉树。对于给定一个有序数组,可以将其视为中序遍历的结果来构造一棵平衡二叉搜索树[^1]。 #### 单层递归逻辑 在递归过程中,选取数组中间位置的元素作为当前根节点,并分别对其左侧部分和右侧部分再次应用相同的逻辑以生成左子树和右子树。 #### Java 实现示例 下面提供了一个基于上述思路的Java代码片段用于演示如何从一个整型数组创建对应的二叉树: ```java public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } } // 主要方法:将数组转化为二叉树 public TreeNode sortedArrayToBST(int[] nums) { if(nums == null || nums.length == 0){ return null; } return helper(nums, 0, nums.length - 1); } private TreeNode helper(int[] nums, int start, int end){ if(start > end){ return null; } // 总是选择中间位置左边的数字作为根节点 int mid = (start + end)/2; TreeNode root = new TreeNode(nums[mid]); // 构建左子树 root.left = helper(nums, start, mid - 1); // 构建右子树 root.right = helper(nums, mid + 1, end); return root; } ``` 此代码定义了一个`TreeNode`类表示二叉树中的每一个结点,并实现了主要的功能函数 `sortedArrayToBST()` 和辅助函数 `helper()` 来完成整个过程。 #### JavaScript 的解决方案 如果考虑JavaScript环境下的情况,则可以通过类似的递归策略来进行转化。需要注意的是,在实际开发环境中可能还需要额外注意边界条件以及异常处理等问题[^3]。 ```javascript function arrayToBst(arr) { function buildTree(left, right) { if (left > right) return null; const mid = Math.floor((left + right) / 2); let node = new Node(arr[mid]); node.left = buildTree(left, mid - 1); node.right = buildTree(mid + 1, right); return node; } return buildTree(0, arr.length - 1); } class Node { constructor(value) { this.value = value; this.left = null; this.right = null; } } ``` 这里展示了另一种语言环境下执行相同任务的例子。 #### 特殊方法讨论 还有一种特别的方法适用于特定场景——即严格按照输入数组顺序建立完全二叉树的情况。这种方法利用了满二叉树性质,其中父节点与其两个孩子之间的关系可通过简单的算术运算得出[^4]。 ```java ThreadNode createTree(int[] data, int index) { ThreadNode node = null; if(index <= data.length){ node = new ThreadNode(data[index - 1]); node.setLeft(createTree(data, 2*index)); node.setRight(createTree(data, 2*index+1)); } return node; } ``` 这段代码展示了一种特殊的递归模式用来按层次填充二叉树节点。 ### 结论 综上所述,无论是采用标准的分治法还是其他变体形式,都可以有效地解决由数组向二叉树转变的问题。每种技术都有其适用范围和局限性,因此应根据具体需求灵活选用合适的方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值