二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回它的最大深度 3 。
思路:利用递归深度遍历二叉树,一个树的最大深度等于左右子树最大深度+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) {
if (root == NULL) return 0;
int leftDepth = maxDepth(root->left);
int rightDepth = maxDepth(root->right);
return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}
};
验证二叉搜索树
描述
- 给定一个二叉树,判断其是否是一个有效的二叉搜索树。
示例
一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。
思路
- 利用搜索树的特性来验证,即左<根<右。左边所有的节点都比根节点小,右边所有的节点都比根节点大。所以每次递归传入一个最小值、一个最大值,所有节点都需满足规则。
- 题目说明是小于和大于,没有相等的情况,因此可以利用中序遍历序列为有序序列来验证。
class Solution{
public:
bool isValidBST(TreeNode* root) {
if (root == NULL)
return true;
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);
}
};
判断满二叉树:
判断满二叉树,递归
1.空树,满
2.左满右满,且左右深度相等,满
3.否则,非满
1.空树,满
2.左满右满,且左右深度相等,满
3.否则,非满
bool isfull( bitree t){
if(!t) return true;
int ldepth,rdepth;
ldepth=depth(t->lchild);
rdepth=depth(t->rchild);
if(isfull(t->lchild)&&isfull(t->rchild)&&ldepth==rdepth)
return true;
return false;
}
int depth( bitree t){
if(!t) return 0;
int ld,rd,d;
ld=depth(t->lchild);
rd=depth(t->rchild);
d=1+ld>rd?ld:rd;
}
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/