【LeetCode题目详解】(五)144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历、104.二叉树的最大深度、110.平衡二叉树

简介: 【LeetCode题目详解】(五)144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历、104.二叉树的最大深度、110.平衡二叉树

一、力扣第144题:二叉树的前序遍历

题目链接:144. 二叉树的前序遍历 - 力扣(Leetcode)

题目描述:

1.解题思路

这道题,在经历了我们上节的分析之后其实难度不大,我们首先遇到的一个困难就是,这个题目要求是传一个数组回去,所以我们必须使用malloc出来的数组,但是这时候产生了第一个困难,数组该开辟多大呢?为了知道开辟多大的数组,我们就得需要先计算出这棵树又多少个结点,于是,我们得先写一个函数去计算结点的个数。计算完毕之后,我们开辟好数组的同时,也将returnSize给他赋值完成。

这样的话,接下来我们就该去遍历这个二叉树,但是二叉树的遍历需要使用递归,而我们肯定不可能递归这个函数,因为这个函数每次都会malloc,所以我们就需要将前序遍历给独立出来,封装成一个函数。这样的话,我们就需要注意的一点就是,当前的数组遍历到哪里去了,这里我们最好使用传址调用。这就是本道题的注意事项了

2.解题代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int TreeSize(struct TreeNode* root)
{
    if(root==NULL)
    {
        return 0;
    }
    else
    {
        return 1+TreeSize(root->left)+TreeSize(root->right);
    }
} 
void _prevOrder(struct TreeNode* root,int* arr,int* i)
{
    if(root==NULL)
    {
        return;
    }
    arr[*i]=root->val;
    (*i)++;
    _prevOrder(root->left,arr,i);
    _prevOrder(root->right,arr,i);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
    int size=TreeSize(root);
    int* arr=(int*)malloc(sizeof(struct TreeNode)*size);
    *returnSize=size;
    int i=0;
    _prevOrder(root,arr,&i);
    return arr;
}

二、力扣第94题:二叉树的中序遍历

题目链接:力扣

题目描述:

这道题其实和上一道题基本一致:那么解题思路也不再赘述,这里直接给出代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int TreeSize(struct TreeNode* root)
{
    if(root==NULL)
    {
        return 0;
    }
    return 1+TreeSize(root->left)+TreeSize(root->right);
}
void _InOrder(struct TreeNode* root,int* arr,int* i)
{
    if(root==NULL)
    {
        return ;
    }
    _InOrder(root->left,arr,i);
    arr[*i]=root->val;
    (*i)++;
    _InOrder(root->right,arr,i);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
    int size=TreeSize(root);
    int* arr=(int*)malloc(sizeof(struct TreeNode)*size);
    *returnSize=size;
    int i=0;
    _InOrder(root,arr,&i);
    return arr;
}

三、力扣第145题:二叉树的后序遍历

题目链接:力扣

题目描述:

同样的,也与前面的题换汤不换药,这里直接给出代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 int TreeSize(struct TreeNode* root)
{
    if(root==NULL)
    {
        return 0;
    }
    else
    {
        return 1+TreeSize(root->left)+TreeSize(root->right);
    }
} 
void _PostOrder(struct TreeNode* root,int* arr,int* i)
{
    if(root==NULL)
    {
        return;
    }
    _PostOrder(root->left,arr,i);
    _PostOrder(root->right,arr,i);
    arr[*i]=root->val;
    (*i)++;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize){
    int size=TreeSize(root);
    int* arr=(int*)malloc(sizeof(struct TreeNode)*size);
    *returnSize=size;
    int i=0;
    _PostOrder(root,arr,&i);
    return arr;
}

四、力扣第104题:二叉树的最大深度

题目链接:力扣

题目描述:

1.解题思路

对于这道题,我们的思想还是使用分治算法,分而治之。也就是需要使用递归,我们是这样想的,当我们接受一棵树以后,我们先判断这颗树是不是为空,为空的话,那么他的高度或深度当然就是0了,但是不为空呢,其实就是他的左子树的的深度与右子树深度这两者中的最大值+1。这样一听似乎就豁然开朗了。

2.解题代码

/**
 * 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=maxDepth(root->left);
    int right_maxDepth=maxDepth(root->right);
    return left_maxDepth>right_maxDepth?left_maxDepth+1:right_maxDepth+1;
}

五、力扣第110题:平衡二叉树

题目链接:力扣

题目描述:

1.解题思路

对于这道题我们得先搞清楚平衡二叉树的定义,一棵树中的每一个结点他的左右子树高度差不超过1。我们在这里很容易想当然的就判断一下一棵树的左子树的深度,右子树的深度,然后做差求绝对值,其实这里就忽略了左右子树是否都满足平衡二叉树的定义。因为他是要求每一棵树都要满足定义的。在这里,我们就发现上一道题就有用起来了。我们直接使用上一道题的函数。然后再里面再套一层递归就可以解决问题了

2.解题代码

/**
 * 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=maxDepth(root->left);
    int right_maxDepth=maxDepth(root->right);
    return left_maxDepth>right_maxDepth?left_maxDepth+1:right_maxDepth+1;
}
bool isBalanced(struct TreeNode* root){
    if(root==NULL)
    {
        return true;
    }
    int leftDepth=maxDepth(root->left);
    int rightDepth=maxDepth(root->right);
    return abs(leftDepth-rightDepth)<2
        && isBalanced(root->left)
        && isBalanced(root->right);
}


总结

本小节讲解了五个关于二叉树力扣题目,总体来说都是比较简单的,但是都使用了一些递归,建议好好理解一下递归的知识。144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历、104.二叉树的最大深度、110.平衡二叉树

相关文章
|
5月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
5月前
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
38 0
|
5月前
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树
35 0
|
5月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
37 0
|
5月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
44 0
|
5月前
【LeetCode 32】111.二叉树的最小深度
【LeetCode 32】111.二叉树的最小深度
36 0
|
6月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
7月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
80 6
|
7月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
162 2
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
113 1