平衡二叉树

排序数组转变为平衡二叉树

守給你的承諾、 提交于 2020-03-02 10:28:06
原题   Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 题目大意   给定一个升序排列的二叉树,将其转换为一棵高度平衡的二叉树。 解题思路   采用递归分治法。 代码实现 树结点类 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 1 2 3 4 5 6 1 2 3 4 5 6 算法 实现类 public class Solution { public TreeNode sortedArrayToBST(int[] nums) { // 参数检验 if (nums == null || nums.length < 1) { return null; } // 递归分治法求解 return solve(nums, 0, nums.length - 1); } /** * 递归分治求解方法 * * @param nums 升序排序数组 * @param start 开始位置 * @param end 结束位置 * @return 根结点 */ public TreeNode solve(int[]

平衡二叉树学习

我与影子孤独终老i 提交于 2020-03-01 01:34:20
1. 二叉树:每个节点最多有2个子树,分为左右子树,且次序不能颠倒。树的第i层最多有2^(i-1)个节点。 2. 二叉排序数(BST):又称二叉查找树。性质如下: 若左子树不为空,那么左子树上所有节点的值均小于它的根节点的值。 若右子树不为空,那么右子树上所有节点的值均大于它的跟节点的值。 左右子树也都是二叉排序树。 没有键值相等的节点。 查找 : 若根结点的关键字值等于查找的关键字,成功。 否则,若小于根结点的关键字值,递归查左子树。 若大于根结点的关键字值,递归查右子树。 若子树为空,查找不成功。 一直往左走就得到最小值,一直往右走就得到最大值。 插入 :从根节点开始,遇键值较大就向左,键值较小就往右,直到尾端就是插入点。 删除 : 如果只有一个子节点,则将子节点移至父节点。 如果有两个节点,则以右子树中最小节点代替(一直往左走就是最小节点)。 3. 平衡二叉树(AVL):是在二叉排序树上引入的。左右子树深度之差不大于1。这样就保证查找的时间复杂度在O(logn)以内。所以在每次删除和插入节点的时候要保持二叉树的平衡。 4. stl中的map和set就是基于AVL的,通常是红黑树。注意这个map与hash_map不一样,hash_map是基于hash表的,即通过key可以直接找到value存放的地址。 来源: oschina 链接: https://my.oschina.net

55.平衡二叉树

↘锁芯ラ 提交于 2020-02-29 18:05:04
比上一道题多了一个条件,左右子树的高度差不能超过1.解决方法依然是递归,假如子树满足平衡二叉树的条件,返回其中较大的高度+1,不满足,直接返回-1.最后通过判断结果是否为-1来判断是否是平衡二叉树 代码如下: 来源: CSDN 作者: qq_40058686 链接: https://blog.csdn.net/qq_40058686/article/details/104575023

平衡二叉树

感情迁移 提交于 2020-02-28 06:47:55
1 #include<time.h> 2 #include<stdio.h> 3 #include<stdlib.h> 4 //左子树比右子树高一 5 #define LH 1 6 //左子树和右子树一样高 7 #define EH 0 8 //左子树比右子树低一 9 #define RH -1 10 #define EQ(a,b) ((a) == (b)) 11 #define LT(a,b) ((a) < (b)) 12 #define LQ(a,b)((a) <= (b)) 13 14 typedef struct BSTNode 15 { 16 int data; 17 int bf; 18 BSTNode * lchild; 19 BSTNode * rchild; 20 }BSTNode; 21 typedef BSTNode * BSTree; 22 23 // 左旋 24 void leftRotate(BSTree & root) 25 { 26 BSTree rc = root->rchild; 27 root->rchild = rc->lchild; 28 rc->lchild = root; 29 root = rc; 30 } 31 // 右旋 32 void rightRotate(BSTree & root) 33 { 34 BSTree lc =

平衡二叉树

时光毁灭记忆、已成空白 提交于 2020-02-27 11:44:18
输入一棵二叉树,判断该二叉树是否是平衡二叉树。 public class Solution { private boolean isBalanced = true; public boolean IsBalanced_Solution(TreeNode root) { getDepth(root); return isBalanced; } public int getDepth(TreeNode root){ if(root == null) return 0; int left = getDepth(root.left); int right = getDepth(root.right); if(Math.abs(left-right)>1){ isBalanced = false; } return right>left ? right+1:left+1; } } 来源: oschina 链接: https://my.oschina.net/u/4167465/blog/3163719

递归生成平衡二叉树

我的未来我决定 提交于 2020-02-26 10:36:11
生成平衡二叉树, 只需要知道节点的数目即可 生成方式采用中序遍历生成, 所以对应的中序遍历结果也是一个递增序列 基本算法思想为对于一个序列 [1, ...., n]对应的二叉树的根节点一定是棋中间节点, 而[1,...mid] mid [mid+1, ... n] 便是最基本的递归单元 class BNode { constructor(id, left, right) { this.id = id this.left = left this.right = right } get child() { return [this.left, this.right].filter(i => i) || [] } } function getBinTree(count) { // 从[st, ed) 构建二叉树 function buildTree(st, ed) { if(st===ed) return null let mid = Math.floor((st + ed + 1) / 2) if (st === ed - 1) { return new BNode(st) } let left = buildTree(st, mid ) // 注意这里需要mid + 1, 当前节点的id为mid let right = buildTree(mid + 1, ed) return

二叉查找树与平衡二叉树

£可爱£侵袭症+ 提交于 2020-02-26 01:28:19
最近在看一些底层东西,涉及到一些树型结构的数据算法,找到一篇非常不错的文章,先膜拜然后在copy过来。 其中可能涉及一些概念,比如:中序遍历,高度什么的,在发个链接参考: https://www.jianshu.com/p/d1133ef8bc0e 二叉查找树   二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么就是具有如下性质的二叉树: (1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3) 任意节点的左、右子树也分别为二叉查找树; (4) 没有键值相等的节点。   如上图所示,是不同形态的二叉查找树。二叉查找树是对要查找的数据进行生成树,左支的值小于右支的值。在查找的时候也是一样的思路,从根节点开始,比节点大进入右支,比节点小进入左支,直到查找到目标值。   二叉查找树的插入算法比较简单:空树,就首先生成根节点;不是空树就按照查找的算法,找到父节点,然后作为叶子节点插入,如果值已经存在就插入失败。   删除操作稍微复杂一点,有如下几种情况: ​ (1)如果删除的是叶节点,可以直接删除; ​ (2)如果被删除的元素有一个子节点,可以将子节点直接移到被删除元素的位置; ​ (3)如果有两个子节点,这时候就采用中序遍历,找到待删除的节点的后继节点

平衡二叉树(AVL树)

前提是你 提交于 2020-02-24 14:22:50
目录 AVL树的提出背景 AVL树的定义 AVL树的定义 AVL树的结点定义 AVL树的简单操作 AVL树的基本操作 查找操作 插入操作 左旋和右旋 插入类型 LL型 LR型 RR型 RL型 小结 代码 建树操作 其他 题型训练 参考文档 AVL树的提出背景 我们知道在 创建二叉查找树 的时候,我们都是使用一个已知的序列,通过从左到右读取序列进行创建。比如对于序列 {1,2,3,4,5} ,我们从左到右读取序列,可以得到如下图的二叉查找树: 显然,这棵二叉查找树是 链式的 。那么,一旦需要对有 1 0 5 10^5 1 0 5 级别个递增元素的序列构建二叉查找树,也将会得到一棵长长的链条式的树,此时对这棵树的结点进行 查找的复杂度 就会达到 O ( n ) O(n) O ( n ) ,这就根本起不到 二叉查找树来进行查询优化的目的 。 综上所述,我们需要对树的结构进行调整,使得树的高度在每次插入元素后 仍然能保持 O ( l o g n ) O(logn) O ( l o g n ) 的级别 ,这样能使查询操作仍然是O(logn)的时间复杂度,于是就产生了平衡二叉树。 AVL树的定义 AVL树的定义 AVL树仍然是一棵二叉查找树 ,只是在二叉查找树的基础上增加了“ 平衡 ”的要求。 平衡 :对AVL树的 任意结点 来说,其左子树与右子树的 高度之差 的绝对值不超过1

平衡二叉树的判断

柔情痞子 提交于 2020-02-24 09:41:41
平衡二叉树的判断 如何判断是否为平衡二叉树? 答: 每个节点的左右子树高度差的绝对值小于等于1,我们认为该二叉树平衡; ​ 只要有一个节点的左右子树高度差绝对值大于1,我们认为这颗二叉树不平衡 。 因此,判断一棵树是否平衡,需要计算树的高度以及判断高度差。 下面介绍两种判断平衡二叉树的方式: 自顶向下 , 自底向上 。 树节点的定义 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ 自顶向下 伪码描述 int getHeight(TreeNode* root){ if(root为空节点) return 0; return 左子树与右子树的最大高度+1; } bool isBalanced(TreeNode* root){ if(root为空节点) return ture; if(左子树为平衡树且右子树为平衡树) if(左子树与右子树的高度差小于2) return true; return false; } Talk is cheap . Show me the code int

Leetcode:110. 平衡二叉树

别来无恙 提交于 2020-02-24 09:30:53
Leetcode: 110. 平衡二叉树 Leetcode: 110. 平衡二叉树 点链接就能看到原题啦~ 关于AVL的判断函数写法,请跳转: 平衡二叉树的判断 废话不说直接上代码吧~主要的解析的都在上面的链接里了 自顶向下写法 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int getHeight(TreeNode* root){ if(root==NULL) return 0; return max(getHeight(root->right),getHeight(root->left))+1; } bool isBalanced(TreeNode* root) { if(root==NULL) return true; if(isBalanced(root->left)&&isBalanced(root->right)) if(abs(getHeight(root->left)-getHeight(root->right))<2)