每天一道LeetCode-----计算二叉树的最大深度及最小深度,判断二叉树是否是高度平衡二叉树
2017-12-28 14:40
716 查看
Maximum Depth of Binary Tree
原题链接Maximum Depth of Binary Tree计算给定二叉树的最大深度,最大深度指从根节点到叶子节点的最长路径上的节点个数
注意叶子节点的定义,只有左右两个子节点都是空节点时,该节点才被称作叶子节点
对于任意一个节点,它的深度是由它左右两个子节点的深度决定的,即如果左右两个子节点的深度分别为HL和HR,那么当前节点的深度就是max(HL,HR)+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) {} * }; */ class Solution { public: int maxDepth(TreeNode* root) { return root ? max(maxDepth(root->left), maxDepth(root->right)) + 1 : 0; } };
Minimum Depth of Binary Tree
原题链接Minimum Depth of Binary Tree计算给定二叉树的最小深度,最小深度指从根节点到叶子节点的最长路径上的节点个数
上面要求是最大深度,所有叶子节点的定义不是很重要,但是最小深度就需要注意叶子节点的定义了。因为如果只是简单的将上述代码的max改为min,那么即使某个节点不是叶子节点,但是它的一个子节点是空节点,那么递归就会返回,从而误判这条路径是最短的
解决方法是判断一个节点是否是叶子节点,代码如下
/** * 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 minDepth(TreeNode* root) { if(!root) return 0; /* 是叶子节点,返回1 */ if(!root->left && !root->right) return 1; /* 不是叶子节点 */ if(root->left && !root->right) return minDepth(root->left) + 1; if(!root->left && root->right) return minDepth(root->right) + 1; return min(minDepth(root->left), minDepth(root->right)) + 1; } };
Balanced Binary Tree
原题链接Balanced Binary Tree判断一个二叉树是否是高度平衡二叉树,要求任意一个节点的左右子树的高度差不能超过1(实际上就是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: bool isBalanced(TreeNode* root) { bool balance = true; height(root, balance); return balance; } private: int height(TreeNode* root, bool& balance) { if(!balance || !root) return 0; int hl = height(root->left, balance); int hr = height(root->right, balance); if(abs(hl - hr) > 1) balance = false; return max(hl, hr) + 1; } };
上面三道题都是关于二叉树的,思路比较简单,需要注意的是二叉树的递归方法,因为在求解二叉树有关问题时通常都需要进行递归
相关文章推荐
- leetcode之二叉树类之二叉树深度系列-----104/111/110/108/109 二叉树最大/最小深度/AVL树的判断和由有序序列生成(牵扯分治相关,OJ105/106)
- 每天一道LeetCode-----判断两个二叉树是否相同
- 每天一道LeetCode-----计算二叉树的最大路径和,路径只需要从一个节点到达另一个节点,无其他要求
- 计算二叉树的深度,判断二叉树是否是平衡二叉树
- 计算二叉树的深度+判断二叉树是否是平衡二叉树
- 【树】二叉树的深度 + 树的最小深度 + 判断是否为平衡二叉树
- 每天一道LeetCode-----判断二叉树左右两边是否成镜像关系
- 剑指offer 面试题39 求二叉树深度|判断是否为平衡二叉树
- 每天一道LeetCode-----判断某棵树是否是二叉搜索树
- 每天一道LeetCode-----判断给定字符串是否符合某个模式
- 每天一道LeetCode-----计算给定序列中所有长度为k的滑动窗的最大值集合
- 二叉树的深度,判断是否是平衡二叉树
- 每天一道LeetCode-----存在一个由加油站组成的环路,判断是否可以从某个加油站出发环绕一周
- 判断二叉树是否平衡,计算树的高度
- 平衡二叉树计算高度的同时判断是否平衡
- LeetCode(Balanced Binary Tree ) 判断一个二叉树是否为平衡二叉树
- Leetcode 110 判断一颗二叉树是否是平衡二叉树
- 39 二叉树的深度和宽度以及判断是否是平衡二叉树
- LeetCode—二叉树的最大最小深度
- 二叉树的(按行打印)层序遍历,树的高度,判断是否为平衡二叉树