LeetCode :: 1.Balanced Binary Tree [树类题目分析]

阅读: 评论:0

LeetCode :: 1.Balanced Binary Tree [树类题目分析]

LeetCode :: 1.Balanced Binary Tree [树类题目分析]

Given a binary tree, determine if it is height-balanced.

For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtreesof every node never differ by more than 1.

这道题目,我选为树类题目的第一题,难度比较低,AC率也高达30%+。虽然题目比较好AC,但是涉及的知识点还是值得回顾一下的。

其实这个红字定义就是AVL(平衡二叉查找树)的一个条件。这样构造的树,保证了树的深度是logN,现在这题目来判断一下这个条件是否成立。

一般树的题目很容易想到的就是递归了,因为树本身就是递归定义出来的,以二叉树为例,定义如下:二叉树是n(n>=0)个有限结点构成的集合。N=0称为空二叉树;n>0的二叉树由一个根结点和两互不相交的,分别称为左子树和右子树的二叉树构成。

解法一、这里最直接的想法是,既然需要每个节点的左右子树的高度差(绝对值)都小于等于1,那么先构建一个求高度的函数height,这里求高度的函数的遍历顺序是后序遍历,然后再从根节点开始,先序遍历(实验室的小伙伴说是后序,这里肯定是先序遍历,因为是先判断了根节点的左右子树高度差)判断每个节点。这样做效率不高,因为重复遍历了两次。

/*** Definition for binary tree* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:int height(TreeNode *node){if (!node)return 0;int  heiL = height(node -> left);int  heiR = height(node -> right);return 1 + (heiL > heiR ? heiL : heiR); }bool isBalanced(TreeNode *root) {if (root == NULL)return true;int diff = height(root -> left) - height(root -> right);if (diff > 1 || diff < -1)return false;return isBalanced(root -> left) && isBalanced(root -> right);}};

解法二、 为了避免两次遍历,直接第一次后序遍历,遍历的时候记录下深度,并且判断便可。


/*** Definition for binary tree* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:bool checkBalance(TreeNode *node, int &dep){if (node == NULL){dep = 0;return true;}int leftDep, rightDep;bool leftBalance = checkBalance(node->left, leftDep);bool rightBalance = checkBalance(node->right, rightDep);dep = max(leftDep, rightDep) + 1;return leftBalance && rightBalance && (abs(rightDep - leftDep) <= 1);}bool isBalanced(TreeNode *root) {// Start typing your C/C++ solution below// DO NOT write int main() functionint dep;return checkBalance(root, dep);}
};

有个需要注意的地方是,这个方法虽然在思路上是时间复杂度更低,但是AC的时间却会更久一些,这点暂时没考虑明白。



本文发布于:2024-02-01 07:10:17,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170674261734790.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:题目   LeetCode   Balanced   Tree   Binary
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23