前言
继承以往刷题训练营的风格,文章会采用循序渐进的过程,本篇是二叉树的刷题训练营,所以不会讲解二叉树的基本知识,如果对于二叉树的基础知识不了解的同学需要自行了解二叉树的基础知识(例如前序,中序,后序等)
一、单值二叉树
1.题目介绍
题目在力扣965. 单值二叉树
2.思路
我们如果想要判断整棵树是不是单值,我们就将每一个节点都比较一下就行了,就是遍历
因为递归的思路就是分治思想,我们可以拿一个小数来说,我们将小数的根的值与其非空的子节点进行比较,如果相等,那就返回ture,放着返回false如下图
所以
1.如果节点为root为空,即返回true
2.当左节点不为空时,左节点不等于root时返回false
3.当右节点不为空时,右节点不等于root时返回false
然后进行遍历就行,只要碰到false就返回false
3.代码解析
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);
}
二、二叉树的最大深度
1.题目介绍
2.思路
分治算法,我们要求一颗树的深度,就像要求一个楼的某一层的高度,我们这层楼的高度等于前一·层的高度加一,同时,这是二叉树,我们是求最大的,所以我们比较左右子树的层数,在大的上加一就是这课树的高度
3.代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int maxDepth(struct TreeNode* root){
if(root==NULL)
{
return 0;
}
int left=maxDepth(root->left);
int right=maxDepth(root->right);
return left>right?left+1:right+1;
}
三、翻转二叉树
1.题目介绍
2.思路
我们盯着一颗小树看,我们是不是只需要交换左子树和右子树就可以
放在整课数上来看,无非就是一个遍历
3.代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* invertTree(struct TreeNode* root){
if(root==NULL)
{
return NULL;
}
struct TreeNode*temp=root->right;
root->right=root->left;
root->left=temp;
invertTree(root->right);
invertTree(root->left);
return root;
}
总结
如果你在有基础的前提下做了上面的题目,是不是越来越炉火纯青了?对于递归有了更加深刻的理解了?后面我将会进一步讲解二叉树的题