0
点赞
收藏
分享

微信扫一扫

leetcode-二叉树oj题-101.对称二叉树,572.另一颗子树,110.平衡二叉树-c

zibianqu 2024-08-11 阅读 4

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);//且每个左右子树都是平衡
    }
}    
举报

相关推荐

0 条评论