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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值