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);
}
};