leetcode第一刷_Balanced Binary Tree

二叉平衡树好火啊,几乎每个公司的笔试题里都有它,考了好多次我都不会,挂笔试很有可能就是因为它,还有一个它的同伙叫二叉搜索树,貌似人气比它还要高一些。二叉平衡树是什么样的树呢,是每个节点的左右子树高度相差绝对值都不超过1。好,你说你终于回了,这不很简单吗,求一下根节点的左右字数高度,如果满足,他就是,否则就不是嘛。不是啊亲,要求是所有节点都满足这个条件,判断的时候必须每个节点都验证的!

扯了这么长,其实看看代码就明白了,怎么有种在贴吧发言要凑够15字的感觉。

int getHeight(TreeNode *root){
    if(root == NULL)    return 0;
    if(!root->left&&!root->right)   return 1;
    return max(getHeight(root->left), getHeight(root->right))+1;
}
class Solution {
public:
    bool isBalanced(TreeNode *root) {
        if(root == NULL)    return true;
        if(!root->left && !root->right) return true;
        if(isBalanced(root->left)&&isBalanced(root->right)&&abs(getHeight(root->left)-getHeight(root->right))<=1)
            return true;
        return false;
    }
};

leetcode第一刷_Balanced Binary Tree

时间: 2024-08-14 09:30:46

leetcode第一刷_Balanced Binary Tree的相关文章

leetcode第一刷_Construct Binary Tree from Inorder and Postorder Traversal

这道题是为数不多的感觉在读本科的时候见过的问题.人工构造的过程是怎样呢,后续遍历最后一个节点一定是整棵树的根节点,从中序遍历中查找到这个元素,就可以把树分为两颗子树,这个元素左侧的递归构造左子树,右侧的递归构造右子树,元素本身分配空间,作为根节点. 于set和map容器不同的是,vector容器不含find的成员函数,应该用stl的库函数,好在返回的也是迭代器,而vector的迭代器之间是可以做减法的,偏移量很方便的得到. TreeNode *buildRec(vector<int> &

leetcode第一刷_Recover Binary Search Tree

这是一道好题,思路虽然有,但是提交之后总是有数据过不了,又按照数据改改改,最后代码都没法看了.收到的教训是如果必须为自己的代码加上很多很多特殊的限定,来过一些特殊的数据的话,说明代码本身有很大的漏洞. 这道题,我想到了要用两个指针保存乱序的节点,甚至想到了用一个pre指针来保存前面一个节点,但是问题出在哪里呢?我觉得应该是自己对树的遍历理解的不够深刻.既然知道了二叉搜索树一定是用中序遍历的,那么程序的框架应该马上写的出来,先左子树,再根,再右子树,那你说什么时候更新pre指针呢,当然是访问根节点

leetcode第一刷_Unique Binary Search Trees

这道题其实跟二叉搜索树没有什么关系,给定n个节点,让你求有多少棵二叉树也是完全一样的做法.思想是什么呢,给定一个节点数x,求f(x),f(x)跟什么有关系呢,当然是跟他的左右子树都有关系,所以可以利用其左右子树的结论,大问题被成功转化成了小问题.最熟悉的方法是递归和dp,这里显然有大量的重复计算,用dp打表好一些. 后来实验的同学说,这其实是一个Catalan数,上网查了一下,果然啊.Catalan数是这样子的: h(0) = 1, h(1) = 1; 递推式:h(n)= h(0)*h(n-1)

leetcode第一刷_Unique Binary Search Trees II

http://acm.hdu.edu.cn/showproblem.php?pid=1507 大致题意:在一个n*m的格子上,黑色的地方不可用,问在白色格子上最多可放多少1*2的矩阵. 思路:建图,每个白色格子与它临近的上下左右的白色格子建边,求最大匹配,答案为最大匹配/2,因为是双向图.最后输出匹配边时,当找到一组匹配边记得将该边标记,以防重复计算. #include <stdio.h> #include <algorithm> #include <set> #inc

leetcode第一刷_Validate Binary Search Tree

有了上面的教训,这道题就简单多了,什么时候该更新pre是明白的了,倒是有个细节,二叉搜索树中是不同意有相等节点的,所以题目的要求用黑体字标明了.写的时候注意就能够了. class Solution { public: TreeNode *pre = NULL; bool isValidBST(TreeNode *root) { if(root == NULL) return true; bool res = true; if(root->left) res &= isValidBST(roo

leetcode第一刷_Add Binary

二进制相加,本质上就是大整数加法,有关大整数加法我的舍友教过我一个非常好的方法,先用一个int数组保存结果,将两个数相应位置相加,所有加完后.再统一处理进位的问题.这种方法相同适用于大整数的乘法. 这个题没什么特别的,注意一下进位别搞错了即可了,还有事实上不用像我写的这么麻烦,能够一開始先推断哪个更长一些.交换一下.代码会简洁非常多. class Solution { public: string addBinary(string a, string b) { int l1 = a.length

leetcode第一刷_Convert Sorted List to Binary Search Tree

好,二叉搜索树粉末登场,有关他的问题有这么几个,给你一个n,怎样求所有的n个节点的二叉搜索树个数?能不能把所有的这些二叉搜索树打印出来? 这道题倒不用考虑这么多,直接转就行了,我用的思想是分治,每次找到一半的位置,分离出中间节点,作为新子树的根节点,然后递归构造前半部分和后半部分. class Solution { public: TreeNode *sortedListToBST(ListNode *head) { if(head == NULL) return NULL; int len =

leetcode第一刷_Binary Tree Inorder Traversal

递归实现当然太简单,也用不着为了ac走这样的捷径吧..非递归实现还挺有意思的. 树的非递归遍历一定要借助栈,相当于把原来编译器做的事情显式的写出来.对于中序遍历,先要訪问最左下的节点,一定是进入循环后,不断的往左下走,走到不能走为止,这时候,能够从栈中弹出訪问的节点,相当于"左根右"过程的"根",然后应该怎么做呢?想一下中序遍历完根节点之后应该干嘛,对,是走到右子树中继续反复这个过程,可是有一点,假设这个节点不包括右子树怎么办?这样的情况下,下一个应该訪问的节点应该

leetcode第一刷_Binary Tree Maximum Path Sum

这是道好题. 题目指明了路径的起点和重点是任意的,可以是一个节点可以是包含父节点和左右子树的路径.问题的关键是,这个左右子树返回的不能是整个树的最大和,而只能是包含了这个子树根节点的一条左路径或者右路径.也不知道这么说是否明白,画图说明是在太麻烦了.. 这么说吧,题目虽然对路径的条件没有限制,但是路径还是要求的,如果直接返回左右子树的结果,那么这个结果可能是来自于一个叶子节点,也可能是整个子树,什么都有可能,当这个结果实际上是由不包含子树的根节点计算出来的,那么接到上一层的时候,用了这个结果,而