二叉树基础OJ练习题
文章目录
一、第一题:965.单值二叉树
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.相同的树
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. 对称二叉树
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. 另一棵树的子树
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到面试题及图解!
如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!