一、需求
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
示例 1:
输入:nums = [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
示例 2:
输入:nums = [1,3] 输出:[3,1] 解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
按 严格递增 顺序排列
二、思路分析图【递归】
三、代码
提供的TreeNode类
package com.bessky.pss.wzw.SuanFa;
/**
* 94. 二叉树的中序遍历
*
* @author 王子威
* @date 2022/7/27
*/
public class TreeNode
{
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) {this.val = val;}
TreeNode(int val, TreeNode left, TreeNode right){
this.val = val;
this.left = left;
this.right = right;
}
}
测试方法
/**
* 入口
* 108. 将有序数组转换为二叉搜索树
* 1.创建链表root
* 输入:
* Int[] nums = [-10,-3,0,5,9]
* 输出:
* result1 = 4
* result2 = 4
* 解释:
* 1.递归
* 2.迭代(Queue队列)
*/
@Test
public void suanfa23()
{
// 0 1 2 3 4
int[] nums = {-10, -3, 0, 5, 9};
// 调用方法:递归
TreeNode treeNode = this.helper(nums,0, nums.length - 1);
}
递归方案
/**
* 递归方案
*
* @param nums 数组
* @param left 左边开始
* @param right 右边结尾
* @return
*/
public TreeNode helper(int[] nums, int left, int right) {
// 房子索引越界
if (left > right)
{
return null;
}
// + 1 是为了防止正数去掉小数值(总是选择中间位置左边的数字作为根节点)
// 左边 【-10, -3】 【-10】
// 右边 【5, 9】 【9】
int mid = (left + right + 1) / 2;
TreeNode root = new TreeNode(nums[mid]);
// [0,-3,9,-10,null,5]
System.out.println("root.val = " + root.val);
// 递归左边数据 mid值:2 1 0 4
root.left = this.helper(nums, left, mid - 1);
// 递归右边数据 mid值:2
root.right = this.helper(nums, mid + 1, right);
// 返回节点
return root;
}
结果图
作者:王子威
四、总结
- 学习了二叉树的中序遍历算法
- 有丝丝进步,递归的逻辑有些清晰了,起码现在能跟完了
- 算法兴趣+1 总:23
- 加强了对算法的分析能力