首页 > 其他分享 >1382. 将二叉搜索树变平衡

1382. 将二叉搜索树变平衡

时间:2023-07-10 20:33:58浏览次数:39  
标签:right TreeNode 树变 二叉 null root 1382 left

给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法,请你返回任意一种。

如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 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] 也是一个可行的构造方案。

> 代码


class Solution {
private:
    vector<int> vec;
    // 有序树转成有序数组
    void traversal(TreeNode* cur) {
        if (cur == nullptr) {
            return;
        }
        traversal(cur->left);
        vec.push_back(cur->val);
        traversal(cur->right);
    }
    // 有序数组转平衡二叉树
    TreeNode* getTree(vector<int>& nums, int left, int right) {
        if (left > right) return nullptr;
        int mid = left + ((right - left) / 2);
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = getTree(nums, left, mid - 1);
        root->right = getTree(nums, mid + 1, right);
        return root;
    }

public:
    TreeNode* balanceBST(TreeNode* root) {
        traversal(root);
        return getTree(vec, 0, vec.size() - 1);
    }
};

标签:right,TreeNode,树变,二叉,null,root,1382,left
From: https://www.cnblogs.com/lihaoxiang/p/17542258.html

相关文章

  • #551. 合并果子(二叉堆)
    #551.合并果子_#551.合并果子方法一:手写堆(题解->陶)#include<bits/stdc++.h>usingnamespacestd;constintmaxn=10000+10;intn,heap[maxn],size=0;voidup(intp)//二叉小根堆向上调整(子节点小于父节点就调整){while(p>1){if(heap[p]<heap[p/2]){......
  • 【算法】根据二叉树的级别返回排序后的元素列表
    根据给定的Node树节点,返回包含按级别排序的树中元素的列表,这意味着根元素位于第一位,然后根子元素(从左到右)位于第二位和第三位,依此类推。1publicclassNode2{3publicNodeLeft;4publicNodeRight;5publicintValue;67publicNode(No......
  • P3378 【模板】二叉堆
    [洛谷]P3378【模板】堆方法一手写堆最小堆插入从新增的最后一个结点的父结点开始,用要插入元素向下过滤上层结点(相当于要插入的元素向上渗透)voidsiftdown(inti)//传入一个需要向下调整的结点编号i,这里传入1,即从堆的顶点开始向下调整{intt,flag=0;//flag用来标......
  • 1644 题「二叉树的最近公共祖先 II
    对于这道题来说,p和q不一定存在于树中,所以你不能遇到一个目标值就直接返回,而应该对二叉树进行完全搜索(遍历每一个节点),如果发现p或q不存在于树中,那么是不存在LCA的。  ......
  • 二叉树解题的
    先在开头总结一下,思维模式分两类:https://labuladong.github.io/algo/2/19/33/1、是否可以通过遍历一遍二叉树得到答案?如果可以,用一个traverse函数配合外部变量来实现,这叫「遍历」的思维模式。2、是否可以定义一个递归函数,通过子问题(子树)的答案推导出原问题的答案?如果可以,......
  • 题:二叉树中m是n的祖先,通过(后序遍历)可以找到m到n的路径
     选项:先序?中序?后序?层次? 题解:1.首先是对路径的解释:访问一个结点x时,栈中结点恰好是x结点的所有祖先,从栈底到栈顶所有结点加上x结点,就构成了从根结点到x结点的一条路径。2.分析:为什么不是先序遍历?(第一次做题时以为这个路径指的是遍历的结果,那先序自然就满足,但这个路径不是遍历......
  • LeetCode 108. 将有序数组转换为二叉搜索树
    题目链接:LeetCode108.将有序数组转换为二叉搜索树题意:给你一个整数数组nums,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过1」的二叉树。解题思路:(递归)O(n)递归建立整......
  • LeetCode 538. 把二叉搜索树转换为累加树
    题目链接:LeetCode538.把二叉搜索树转换为累加树题意:给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换为累加树(GreaterSumTree),使每个节点node 的新值等于原树中大于或等于 node.val 的值之和。解题思路:根据二叉搜索树的性质,二叉树每个节点看做根节点时,右边......
  • LeetCode 669. 修剪二叉搜索树
    题目链接:LeetCode669.修剪二叉搜索树题意:给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值在[low,high]中。修剪树不应该 改变保留在树中的元素的相对结构(即,如果没有被移除,原有的父代子代关系都应当保留)。可以证......
  • LeetCode 235. 二叉搜索树的最近公共祖先
    题目链接:LeetCode235.二叉搜索树的最近公共祖先题意:给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。解题思路:对于二叉搜索树,找两个点的最近公共祖先,这两个点所处的位置只有两种情况:情况一:两点在根节点的左右两侧情况二:两点在根节点的一侧(左侧或者右侧)递归......