a、题目链接
101.对称二叉树
572.另一棵树的子树
110.平衡二叉树
一、题目讲解
101.对称二叉树
1、题目
此题与 相同的树 类似,相同的树讲解
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、题目
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.题目
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);//且每个左右子树都是平衡
}
}