965. 单值二叉树 ;100.相同的树;101. 对称二叉树;572. 另一棵树的子树

二叉树基础OJ练习题




一、第一题:965.单值二叉树

Leedcode链接:

1.题目

在这里插入图片描述

在这里插入图片描述

题目:如下(示例):

bool isUnivalTree(struct TreeNode* root)
{
    
      }

2.思路+源码

既要保证 roof 的左子树等于右子树并且等于根节点(当二叉树为空时,也返回true)

代码如下(示例):

bool isUnivalTree(struct TreeNode* root){
    
    
    if(root == NULL)
        return true;
    if(root -> left && root -> left->val != root->val)
        return false;
    if(root -> right && root -> right -> val != root->val)
        return false;
    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

3.递归图解

为了方便我们就用下面这个图进行递归展开图,为了更好地理解,我只画了左子树的递归图,感兴趣的可以自己实现一下!
在这里插入图片描述


在这里插入图片描述


二、第二题:100.相同的树

Leedcode链接:

1.题目

在这里插入图片描述

在这里插入图片描述

题目:如下(示例):

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
    
     }

2.思路+源码

(1).当p和q都为空时,返回true
(2).其中一个不为空时返回false
(3).都不为空时,p的val不等于q的val时,返回false
接下来通过递归实现对p和q每一个节点进行比较!如下面源码以及图解演示
注意:这道题时间复杂度为O(N)(这道题相当于遍历了一遍二叉树所以为O(N))


代码如下(示例):

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);
}

3.递归图解

为了方便我们就用下面这个图进行递归展开图
在这里插入图片描述


在这里插入图片描述


三、第三题:101. 对称二叉树

Leedcode链接

1.题目

在这里插入图片描述
在这里插入图片描述


题目:如下(示例):

bool isSymmetric(struct TreeNode* root)
{
    
     }

2.思路+源码

这道题我们重新写一个子函数
1.如果root为NULL,就直接返回true(空树是对称的)
2.roof的左树和右树都是NULL时为true,有一个不为NULL,就是false
3.用子函数进行递归:比较左子树和右子树的val值,相同就继续比较!


代码如下(示例):

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)
{
    
    
    if(root == NULL)
    {
    
    
        return true;
    }
    return _isSymmetric(root->left , root ->right);
}

3.递归图解

为了方便我们就用下面这个图进行递归展开图,这里我们只懂子函数的递归展开图即可,主函数只判断空树的情况!
在这里插入图片描述


在这里插入图片描述


四、第四题:572. 另一棵树的子树

Leedcode链接

1.题目

在这里插入图片描述

在这里插入图片描述


题目:如下(示例):

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{
    
     }


2.思路+源码

1.如果root本来就是NULL,就不可能相同,返回false
2.用我们之前写的函数isSameTree函数(本文第三道题)判断是否正确
3.不断递归,直到找到另一棵树的子树为止!
注意:这种算法的时间复杂度最好为:O(N)(只遍历一次就找到了);最坏:O(N^2)(遍历N次且isSame寻找N次)


代码如下(示例):

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(isSameTree(root , subRoot))
    {
    
    
        return true;
    }
    return isSubtree(root->left , subRoot)
        || isSubtree(root->right , subRoot);
}

3.递归图解

为了方便我们就用下面这个图进行递归展开图!注意:这个树结构较简单,我们在画递归图的时候可以从简单开始一步一步画起
在这里插入图片描述


在这里插入图片描述


总结

以上就是本文要讲的内容,本文详细讲解了Leedcode二叉树初阶相关的4到面试题及图解!
如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/2201_75587702/article/details/129944476