当前位置:网站首页>生成二叉搜索平衡树[利用树递归特性]
生成二叉搜索平衡树[利用树递归特性]
2022-06-23 15:13:00 【REN_林森】
前言
对于树而言,就是一个递归结构,也致于处理好任意一颗子树,就处理好了整个树。所以递归结构就只有一个递归体这么简洁。利用树的递归特性,采用从下到上的子树生成+拼接来完成二叉搜索平衡树的生成。
一、有序链表转换二叉搜索树

二、从下到上回溯生成二叉搜索平衡树
package everyday.medium;
import java.util.ArrayList;
import java.util.List;
// 有序链表转换为二叉搜索树
public class SortedListToBST {
/* target:将升序单向链表转化成高度平衡二叉搜索树。 先把链表元素放数组中,便于递归取值。 树还是需要递归生成,而且需要从上往下生成。 */
public TreeNode sortedListToBST(ListNode head) {
// 取单向链表元素。
List<Integer> nums = new ArrayList<>();
while (head != null) {
nums.add(head.val);
head = head.next;
}
// 递归生成树。
return buildTree(nums, 0, nums.size() - 1);
}
private TreeNode buildTree(List<Integer> nums, int begin, int end) {
// 当begin > end时,说明没有可生成节点,那就生成null节点。
if (begin > end) return null;
// 当只有一个元素时,返回叶子节点。
if (begin == end) return new TreeNode(nums.get(begin));
// 递归生成树。
// 加1纯粹是看leetcode例子,当两个值时,选左 + 根。
// 可以不加1,则表示,当两个值时,选根 + 右。
int mid = begin + (end - begin + 1 >>> 1);
TreeNode root = new TreeNode(nums.get(mid));
root.left = buildTree(nums, begin, mid - 1);
root.right = buildTree(nums, mid + 1, end);
// 返回生成好的子树。
return root;
}
// Definition for singly-linked list.
public class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
// Definition for a binary tree node.
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;
}
}
}
总结
1)利用好树的递归特质。
2)从下到上生成并拼装树。
参考文献
边栏推荐
- Convert JSON file of labelme to coco dataset format
- 【无标题】激光焊接在医疗中的应用
- 重卡界销售和服务的“扛把子”,临沂广顺深耕产品全生命周期服务
- 图片读取:Image.open(ImgPath)
- 139. 單詞拆分
- Analysis of graphical level-1 programming problem of Electronic Society: cat and mouse
- PHP指定字段大于100正序排,小于100随机排
- 32. Compose 优美的触摸动画
- VIM backup history command
- ABP框架之——数据访问基础架构(下)
猜你喜欢

基因检测,如何帮助患者对抗疾病?

get_edges

Shandong: food "hidden money", consumption "sweeping monk"

JS traversal array (using the foreach () method)

golang 重要知识:mutex

电子学会图形化一级编程题解析:猫捉老鼠

Top 10 purchase, sales and inventory software rankings!

A transformer can only convert alternating current. How can I convert direct current?

Usestate vs useref and usereducer: similarities, differences and use cases

golang 重要知识:sync.Once 讲解
随机推荐
JS创建一个数组(字面量)
Leetcode 450.删除二叉搜索树中的结点
Big factory Architect: how to draw a grand business map?
创建好后的模型,对Con2d, ConvTranspose2d ,以及归一化BatchNorm2d函数中的变量进行初始化
Unshift() and shift() of JS
Important knowledge of golang: sync Once explanation
FPGA 常用缩写及单词在工程领域内的意义
Thymeleaf——学习笔记
Three simple tips for accelerating yarn install
[MAE]Masked Autoencoders掩膜自编码器
stylegan2:analyzing and improving the image quality of stylegan
Gartner最新报告:低代码应用开发平台在国内的发展
【无标题】激光焊接在医疗中的应用
C. Set or Decrease-Educational Codeforces Round 120 (Rated for Div. 2)
Important knowledge of golang: mutex
Sectigo(Comodo)证书的由来
MIPI C-PHY协议你了解吗?手机高速接口之一
股票开账户如何优惠开户?在线开户安全么?
[普通物理] 半波损失 等厚与等倾干涉
Introduction to the push function in JS