一、二叉树的最大深度
(1)、题目
给定一个二叉树 root
,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:3
示例 2:
输入:root = [1,null,2] 输出:2
(2)、代码
采用分治的思想,将问题简化处理,一棵树的最大深度,无非就是左子树和右子树二者的最大深度再加上根,就是整棵树的深度。
如果左子树的深度大于右子树的深度,就返回左子树深度再加一,
如果右子树的深度大于左子树的深度,就返回右子树的深度再加一。
效率较低的代码示例
该代码在返回时,运用了三元运算符,在表达式中要计算两个maxDepth的递归算法,在两个结果中又要重复计算两次递归的maxDepth算法,有点啰嗦了。
int maxDepth(struct TreeNode* root) {
if(root==NULL){
return 0;
}
return maxDepth(root->left)>maxDepth(root->right)?maxDepth(root->left)+1:maxDepth(root->right);
}
效率较高的代码:
该函数在返回运算前,先将左子树的最大深度和右子树的最大深度先保存起来,最后比较使用,减少了函数调用的次数,提高了效率。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int maxDepth(struct TreeNode* root) {
if(root==NULL){
return 0;
}
int leftDepth=maxDepth(root->left);
int rightDepth=maxDepth(root->right);
return leftDepth>rightDepth?leftDepth+1:rightDepth+1;
}
二、判断某二叉树是否为平衡二叉树
(1)、题目
给定一个二叉树,判断它是否是
平衡二叉树
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:true
示例 2:
输入:root = [1,2,2,3,3,null,null,4,4] 输出:false
示例 3:
输入:root = [] 输出:true
(2)、代码
定义:这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过 1,则二叉树是平衡二叉树。
思路:一个树是二叉树必须保证某个节点的左右子树的高度差小于2,并且左右子树都是平衡二叉树。该代码运用到了求二叉树的最大深度(高度)。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int maxDepth(struct TreeNode*root){
if(root==NULL){
return 0;
}
int leftDepth=maxDepth(root->left);
int rightDepth=maxDepth(root->right);
return leftDepth>rightDepth?leftDepth+1:rightDepth+1;
}
bool isBalanced(struct TreeNode* root) {
if(root==NULL){
return true;
}
int leftDepth=maxDepth(root->left);
int rightDepth=maxDepth(root->right);
return abs(leftDepth-rightDepth)<2&&isBalanced(root->left)&&isBalanced(root->right);
}