a、题目链接
101.对称二叉树
572.另一棵树的子树
110.平衡二叉树
一、题目讲解
101.对称二叉树
1、题目
给你一个二叉树的根节点
root
, 检查它是否轴对称。示例1:
输入:root = [1,2,2,3,4,4,3 ]
输出:true
示例2:
输入:root = [1,2,null,3,null,3]
输出:false
提示:
- 树中节点数目在范围
[1, 1000]
内-100 <= Node.val <= 100
题目所给函数:
bool isSymmetric(struct TreeNode* root) { }
此题与 相同的树 类似,相同的树讲解
2、思路:
区别在于是求同一棵树的左右子树是否是镜像(即左子树和右子树比较,左孩子的值和右孩子的值比较),因此我们可以想到,设一个子函数便于去递归左右子树。
代码:
bool _isSymmetric(struct TreeNode* root1,struct TreeNode* root2)
{
if(root1 == NULL && root2 == NULL)
{
return true;
}
if(root1 == NULL || root2 == NULL)
{
return false;
}
if(root1->val != root2 ->val )
{
return false;
}
return _isSymmetric( root1->left, root2->right)&&
_isSymmetric(root1->right,root2->left);
}
bool isSymmetric(struct TreeNode* root) {
return _isSymmetric(root->left,root->right);
}
572.另一棵树的子树
1、题目
给你两棵二叉树
root
和subRoot
。检验root
中是否包含和subRoot
具有相同结构和节点值的子树。如果存在,返回true
;否则,返回false
。二叉树
tree
的一棵子树包括tree
的某个节点和这个节点的所有后代节点。tree
也可以看做它自身的一棵子树。示例1:
输入:root = [3,4,5,1,2], subRoot = [4,1,2] 输出:true示例2:
输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2] 输出:false提示:
root
树上的节点数量范围是[1, 2000]
subRoot
树上的节点数量范围是[1, 1000]
-10^4 <= root.val <= 10^4
-10^4 <= subRoot.val <= 10^4
题目所给函数:
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){ }
2、思路
由题可知道,另一颗树的子树必须与那棵树是同样的,不能多不能少。
我们画一个这样的图,哪一颗是我们要找的子树?
经过你的思考是否找对了呢
是的,被红圈圈住的子树才是我们要找的另一棵树的子树
在这里我们知道,要想准确的找到这棵树在另一棵树时的同样的树,一定要找全所有的节点,因此,我们需要遍历所有的节点。找完所有的左右子树。
代码:
这里我们用到了相同的树的代码,当我们发现一个节点的值都相同时,不代表它就是正确的子树,因此我们使用相同的树的函数进行判断。若不是,则再对接下来的子树进行遍历。
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
//都为空
if(p == NULL && q == NULL)
return true;
//其中一个为空
if(p == NULL || q == NULL)
return false;
//都不为空切不相等
if(p->val != q->val)
return false;
return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
if(root == NULL)
{
return false;
}
if(root->val == subRoot->val)
{
if( isSameTree(root,subRoot))
return true;
}
return isSubtree(root->left,subRoot)||
isSubtree(root->right,subRoot);
}
110.平衡二叉树
1.题目
给定一个二叉树,判断它是否是 平衡二叉树(平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1。)
示例1:
输入:root = [3,9,20,null,null,15,7] 输出:true示例2:
输入:root = [1,2,2,3,3,null,null,4,4] 输出:false示例3:
输入:root = [] 输出:true提示:
- 树中的节点数在范围
[0, 5000]
内-104 <= Node.val <= 104
2.思路:
由已知条件,其实我们可以知道,这道题需要用到二叉树的高度的函数,并且要进行递归,检查所有的左右子树是否是平衡,高度相差不大于1
代码:
int TreeHeight(struct TreeNode* root)
{
if (root == NULL)
{
return 0;
}
return fmax(TreeHeight(root->left), TreeHeight(root->right)) + 1;
}
bool isBalanced(struct TreeNode* root) {
if(root == NULL)
{
return true;
}
else
{
return fabs(TreeHeight(root->left) - TreeHeight(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right);//且每个左右子树都是平衡
}
}