每日小细节新增算法好题合集,现在是初阶,每天会更新至少两道题目,感兴趣的小伙伴赶紧关注收藏不迷路哦
花费几分钟就能积累一种新的解题思路多是一件美事啊~
1.二叉树层序遍历
之前我们说过了三种遍历方式,更难的就是层序
顾名思义,一层一层遍历之后按照每行的格式输出
C语言要使用队列来帮助我们,首先root入队,然后pop,再带入root的两个孩子节点,然后等队列空了之后,把孩子节点的孩子节点push
然后就是队列,要用两个下标维护,队列头尾
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
*returnSize=0;
if(root==NULL)
return NULL;
struct TreeNode *queue[10000];
int **ans=(int**)malloc(sizeof(int*)*10000),head=0,tail=0;
*returnColumnSizes=(int*)malloc(sizeof(int)*10000);
queue[tail++]=root;
while(head!=tail)//这个是大循环
{
int temp=tail,k=0;
ans[*returnSize] = (int*)malloc(sizeof(int) * (tail-head));
while(head<temp)//为什么要用temp是因为tail的值是会在这个循环里变的,tail指向队尾节点,根据上面说的,
{//每次遍历完一个节点的左右两个子节点后都要把他们加入队列,则tail需要增大
struct TreeNode *p=queue[head++];
ans[*returnSize][k++] = p->val;
if(p->left)
{
queue[tail++]=p->left;
}
if(p->right)
{
queue[tail++]=p->right;
}
}
(*returnColumnSizes)[*returnSize] = k;
(*returnSize)++;
}
return ans;
}
2.二叉树的最大深度
最大深度就是把每一个子树都走到尽头,然后比较出最深的深度+1
int maxDepth(struct TreeNode* root){
if(root==NULL)
{
return 0;
}
int left=maxDepth(root->left);
int right=maxDepth(root->right);
return 1+fmax(left,right);
}
3.对称二叉树
递归,只要判断子树是不是对称即可
bool _isSymmetric(struct TreeNode* left,struct TreeNode* right){
if(left==NULL && right==NULL)
{
return true;
}
if(left==NULL ||right==NULL)
{
return false;
}
if(left->val!=right->val)
{
return false;
}
return _isSymmetric(left->left,right->right)&&_isSymmetric(left->right,right->left);
}
bool isSymmetric(struct TreeNode* root){
if(root==NULL)
{
return true;
}
return _isSymmetric(root->left,root->right);
}