1 单值二叉树
1.1 题目介绍
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。
示例 1:
输入:[1,1,1,1,1,null,1]
输出:true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/univalued-binary-tree
1.2 题目分析
使用递归的思路来进行解题:
定义新的函数:bool _isUnivalTree(struct TreeNode* root , int val);
若一个二叉树为单值二叉树,则:
- 当前二叉树为空二叉树;
- 当前二叉树为非空二叉树:
根节点的值==val;
左子树为单值二叉树,且值为val;
右子树为单值二叉树,且值为val;
1.3 程序代码
bool _isUnivalTree(struct TreeNode* root , int val){
//当前二叉树为非空二叉树
if(root){
return root->val == val && _isUnivalTree(root->left , val)
&& _isUnivalTree(root->right,val);
}
return true ;
}
bool isUnivalTree(struct TreeNode* root){
//当前二叉树为空二叉树
if(root == NULL)
return true ;
return _isUnivalTree(root , root->val);
}
1.4 运行结果
2 二叉树的最大深度
2.1 题目介绍
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
返回它的最大深度 3 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree
2.2 题目分析
二叉树的最大深度:
- 二叉树为空二叉树时,深度=0;
- 二叉树为非空二叉树时,二叉树最大深度=max(左子树最大深度,右子树最大深度)+1;
2.3 程序代码
int maxDepth(struct TreeNode* root){
if(root == NULL)
return 0 ;
int l = maxDepth(root->left);
int r = maxDepth(root->right);
return l > r ? l+1 : r+1;
}
2.4 运行结果
3 翻转二叉树
3.1 题目介绍
翻转一棵二叉树。
示例:
输入:
输出:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/invert-binary-tree
3.2 题目分析
翻转一棵二叉树:
- 当二叉树为空二叉树时,直接返回即可
- 当二叉树为非空二叉树时:
交换左右子树;
将左子树进行翻转;
将右子树进行翻转;
3.3 程序代码
struct TreeNode* invertTree(struct TreeNode* root){
if(root){
struct TreeNode* node = root->left;
root->left = root->right ;
root->right = node ;
invertTree(root->left);
invertTree(root->right);
}
return root ;
}
3.4 运行结果
4 相同的树
4.1 题目介绍
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 :
输入:p = [1,2,3], q = [1,2,3]
输出:true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/same-tree
4.2 题目分析
- 当两个二叉树的根节点均为空时,两棵树相同;
- 当有一棵二叉树的根节点为空时,两棵树不同;
- 当两棵二叉树的根节点均不为空时,满足下述条件表示两棵树相同:
根节点的值相同;
两棵树的左子树相同;
两棵树的右子树相同。
4.3 程序代码
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
//判断当前节点是否相同
if(p == NULL && q == NULL)
return true ;
if(p == NULL)
return false ;
if(q == NULL)
return false ;
//判断左子树是否相同
return p->val == q->val && isSameTree(p->left , q->left)
&& isSameTree(p->right , q->right);
}