> 文档中心 > 《五月集训》第十九天——二叉树

《五月集训》第十九天——二叉树

文章目录

  • 前言
  • 💎一、题目一
    • 🏆1.题目描述
    • 🏆2.解题思路
    • 🏆3.代码详解
  • 💎二、题目二
    • 🏆1.题目描述
    • 🏆2.解题思路
    • 🏆3.代码详解
  • 💎三、题目三
    • 🏆1.题目描述
    • 🏆2.解题思路
    • 🏆3.代码详解
  • 💎四、题目四
    • 🏆1.题目描述
    • 🏆2.解题思路
    • 🏆3.代码详解
  • 💎五、星球推荐

前言

        二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分 。
        二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点
刷题坚持每一天,以下题目引用自:力扣(LeetCode)

💎一、题目一

🏆1.题目描述

原题链接:144. 二叉树的前序遍历

        给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:
《五月集训》第十九天——二叉树
输入:root = [1,null,2,3]
输出:[1,2,3]

🏆2.解题思路

🔑思路:

​         先访问根节点,在访问左子树、右子树。

🏆3.代码详解

void preorder(struct TreeNode* root, int* ans, int* idex){    if(root == NULL) return;    ans[(*idex)++] = root->val;    preorder(root->left, ans, idex);    preorder(root->right, ans, idex);}int* preorderTraversal(struct TreeNode* root, int* returnSize){    int* ans = (int*)malloc(sizeof(int)*101);    int idex = 0;    preorder(root, ans, &idex);    * returnSize = idex;    return ans;}

💎二、题目二

🏆1.题目描述

原题链接:94. 二叉树的中序遍历

        给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:
《五月集训》第十九天——二叉树
输入:root = [1,null,2,3]
输出:[1,3,2]

🏆2.解题思路

🔑思路:

​         先访问左子树,在访问根节点、右子树。

🏆3.代码详解

void inorder(struct TreeNode* root, int* ans, int* idex){    if(root == NULL) return;    inorder(root->left, ans, idex);    ans[(*idex)++] = root->val;    inorder(root->right, ans, idex);}int* inorderTraversal(struct TreeNode* root, int* returnSize){    int* ans = (int*)malloc(sizeof(int)*101);    int idex = 0;    inorder(root, ans, &idex);    * returnSize = idex;    return ans;}

💎三、题目三

🏆1.题目描述

原题链接:145. 二叉树的后序遍历

        给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。

示例 1:
《五月集训》第十九天——二叉树
输入:root = [1,null,2,3]
输出:[3,2,1]

🏆2.解题思路

🔑思路:

​        先访问左子树,再访问右子树、根节点。

🏆3.代码详解

void postorder(struct TreeNode* root, int* ans, int* idex){    if(root == NULL) return;    postorder(root->left, ans, idex);    postorder(root->right, ans, idex);    ans[(*idex)++] = root->val;}int* postorderTraversal(struct TreeNode* root, int* returnSize){    int* ans = (int*)malloc(sizeof(int)*101);    int idex = 0;    postorder(root, ans, &idex);    * returnSize = idex;    return ans;}

💎四、题目四

🏆1.题目描述

原题链接:104. 二叉树的最大深度

        给定一个二叉树,找出其最大深度。
        二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
        说明: 叶子节点是指没有子节点的节点。

示例 1:
给定二叉树 [3,9,20,null,null,15,7],
    3
   /  \
9    20
      /   \
    15   7
返回它的最大深度 3 。

🏆2.解题思路

🔑思路:

​         递归遍历左右子树,当左、右孩子不为空深度就加一。

🏆3.代码详解

int maxDepth(struct TreeNode* root){    if(root == NULL) return NULL;    int left_maxDepth = 1;    int right_maxDepth = 1;    if(root->left) left_maxDepth = left_maxDepth + maxDepth(root->left);    if(root->right) right_maxDepth = right_maxDepth + maxDepth(root->right); return right_maxDepth > left_maxDepth ? right_maxDepth : left_maxDepth;}

💎五、星球推荐

        星球链接:英雄算法联盟

星球里有什么?
        【朋友圈】一个极致精准的自律、编程、算法的小圈子。
        【算法集训】以月为单位组织算法集训,每天四题,风雨无阻。
        【排行榜】每天、每周都会有榜单,激励大家不断进步,不断成长。
        【个人规划】每个人都写好自己的规划,也可以查看他人的规划,时刻警醒自己不掉队。
        【打卡挑战】每日一题打卡、每日早起打卡、算法集训打卡、规划完成情况打卡。
在星球里做什么?
        目前星球人数达到420+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。