104. 二叉树的最大深度
描述
- 给定一个二叉树,找出其最大深度。
- 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明
示例
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
思路
- 利用递归深度遍历二叉树,一个树的最大深度等于左右子树最大深度+1
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution_104 {
public:
int maxDepth(TreeNode* root) {
if (root == NULL) return 0;
int leftDepth = maxDepth(root->left);
int rightDepth = maxDepth(root->right);
return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}
};
98. 验证二叉搜索树
描述
- 给定一个二叉树,判断其是否是一个有效的二叉搜索树。
示例
一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。
思路
- 利用搜索树的特性来验证,即左<根<右。左边所有的节点都比根节点小,右边所有的节点都比根节点大。所以每次递归传入一个最小值、一个最大值,所有节点都需满足规则。
- 题目说明是小于和大于,没有相等的情况,因此可以利用中序遍历序列为有序序列来验证。
Tips
- 第一次尝试的解法是错误的,认为只要左节点小于根节点,右节点大于根节点就满足要求。忽略了整个左子树中每个点都要比根小,整个右子树中每个点都比根要大的特性。
- 参考了网上的一个博文(地址)
class Solution_98_01 {
public:
bool isValidBST(TreeNode* root) {
return _isValidBST(root, LONG_MIN, LONG_MAX);
}
bool _isValidBST(TreeNode* root, long min, long max) {
if (root == NULL) return true;
if (root->val <= min || root->val >= max) return false;
return _isValidBST(root->left, min, root->val) &&
_isValidBST(root->right, root->val, max);
}
};
class Solution_98_02 {
public:
bool isValidBST(TreeNode* root) {
if (root == NULL)
return true; // 此行注释掉会报错,reference binding to null pointer of
// type 'value_type'
vector<int> nums;
inOrder(root, nums);
for (int i = 0; i < nums.size() - 1; ++i) {
if (nums[i] >= nums[i + 1]) return false;
}
return true;
}
void inOrder(TreeNode* root, vector<int>& nums) {
if (root == NULL) return;
inOrder(root->left, nums);
nums.push_back(root->val);
inOrder(root->right, nums);
}
};