当前位置: 首页 > news >正文

每日算法题【二叉树】:对称二叉树、二叉树的前中后序遍历

(3)对称二叉树
  • 101. 对称二叉树 - 力扣(LeetCode)

  • 解题思路:

    1. 算法思路
      • 空树是对称的
      • 非空树需要满足:
        1. 左右子树的根节点值相等
        2. 左子树的左子树与右子树的右子树镜像对称
        3. 左子树的右子树与右子树的左子树镜像对称
    /*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*///自定义镜像比较函数,递归检查两个子树是否轴对称
    bool IsMirror(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 IsMirror(left->left,right->right) && IsMirror(left->right,right->left);
    }bool isSymmetric(struct TreeNode* root) {//根节点为空默认轴对称if(root == NULL){return true;}//要比较两棵子树的对称情况,必须传入两个子树的根节点return IsMirror(root->left,root->right);
    }
    

(4)二叉树的前序遍历
  • 144. 二叉树的前序遍历 - 力扣(LeetCode)

  • 解题思路:

    利用递归的思想,前序遍历就是先遍历根节点,再遍历左子树,最后是右子树

    第一步:计算二叉树的节点总数并申请对应的数组空间

    第二步:通过前序遍历,将节点依次放入数组中,需注意索引要传地址,这样递归下去才会是同一个索引

    递归思想:首先找到递归条件(根节点为空则直接返回),因为是前序所以先对根节点进行操作,然后通过再次调用函数递到下一层子树的根节点,等最后一层的子树的根节点也为空,再依次返回。

    /*** 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().*///前序遍历 根节点 左子树  右子树//计算节点总数的函数
    void CountNodes(struct TreeNode* root,int* count){//通过前序遍历给传地址的count++//递归结束条件if(root == NULL){return;}(*count)++;             	//根节点CountNodes(root->left,count); //左子树CountNodes(root->right,count);//右子树
    }//前序遍历二叉树函数
    void PrevOrder(struct TreeNode* root,int* result,int* index){//递归结束条件if(root == NULL){return;}result[(*index)++] = root->val;     //根节点PrevOrder(root->left,result,index);//左子树PrevOrder(root->right,result,index);//右子树
    }int* preorderTraversal(struct TreeNode* root, int* returnSize) {//先计算节点总数来为创建的数组申请空间int count = 0;CountNodes(root,&count);//计算出来的节点数返还给returnSize并判空*returnSize = count;if(*returnSize == 0){return NULL;}//不为空则为数组申请空间int* result = (int*)malloc(count*sizeof(int));//通过自定义函数递归来填充数组int index = 0;PrevOrder(root,result,&index);return result;
    }
    

(5)二叉树中序遍历
  • 94. 二叉树的中序遍历 - 力扣(LeetCode)

  • 解题思路:

    同前序遍历一样

    /*** 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().*///中序遍历 左子树   根节点   右子树//计算节点总数的函数
    void CountNodes(struct TreeNode* root,int* count){//通过中序遍历给传地址的count++//递归结束条件if(root == NULL){return;}CountNodes(root->left,count); //左子树(*count)++;             	//根节点CountNodes(root->right,count);//右子树
    }//中序遍历二叉树函数
    void InOrder(struct TreeNode* root,int* result,int* index){//递归结束条件if(root == NULL){return;}InOrder(root->left,result,index);//左子树result[(*index)++] = root->val;     //根节点InOrder(root->right,result,index);//右子树
    }int* inorderTraversal(struct TreeNode* root, int* returnSize) {//先计算节点总数来为创建的数组申请空间int count = 0;CountNodes(root,&count);//计算出来的节点数返还给returnSize并判空*returnSize = count;if(*returnSize == 0){return NULL;}//不为空则为数组申请空间int* result = (int*)malloc(count*sizeof(int));//通过自定义函数递归来填充数组int index = 0;InOrder(root,result,&index);return result;
    }
    

(6)二叉树的后序遍历
  • 145. 二叉树的后序遍历 - 力扣(LeetCode)

  • 解题思路:

    同前序遍历一样

    /*** 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().*///后序遍历 左子树   右子树   根节点   //计算节点总数的函数
    void CountNodes(struct TreeNode* root,int* count){//通过后序遍历给传地址的count++//递归结束条件if(root == NULL){return;}CountNodes(root->left,count); //左子树CountNodes(root->right,count);//右子树(*count)++;             	//根节点
    }//后序遍历二叉树函数
    void PostOrder(struct TreeNode* root,int* result,int* index){//递归结束条件if(root == NULL){return;}PostOrder(root->left,result,index);//左子树PostOrder(root->right,result,index);//右子树result[(*index)++] = root->val;     //根节点
    }int* postorderTraversal(struct TreeNode* root, int* returnSize) {//先计算节点总数来为创建的数组申请空间int count = 0;CountNodes(root,&count);//计算出来的节点数返还给returnSize并判空*returnSize = count;if(*returnSize == 0){return NULL;}//不为空则为数组申请空间int* result = (int*)malloc(count*sizeof(int));//通过自定义函数递归来填充数组int index = 0;PostOrder(root,result,&index);return result;
    }
    
http://www.xdnf.cn/news/1394875.html

相关文章:

  • 回车换行、缓冲区刷新、倒计时小程序
  • MQTT高延迟通信优化指南
  • Python的Listd 数据格式 V0.1
  • 深入解析Nginx核心模块
  • DAY 17 常见聚类算法-2025.8.29
  • 将数据赋值到多个文档里,并将多个word放入压缩包并下载
  • 非标设计 机架模板 misumi 设计组合案例
  • 小康AI家庭医生,亮相2025WteamAI创客节!
  • 【51单片机】【protues仿真】 基于51单片机智能视力保护台灯系统
  • 13 SQL进阶-InnoDB引擎(8.23)
  • Elasticsearch 9.X 使用推理 API 进行语义搜索
  • 2025年06月 Scratch 图形化(一级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 《跳出“技术堆砌”陷阱,构建可演进的软件系统》
  • opencv基础学习与实战之轮廓分析与模板匹配(4)
  • Wi-Fi 时延与掉包的关键因素全解析
  • 整理python接口自动化相关——10、自动考虑点(待续)
  • 【51单片机定时1秒中断控制流水灯方向】2022-11-14
  • 实现动态数组
  • 听听广播 安卓网络收音机v2.1.6 支持定时闹钟回听各地电台
  • MySQL高频问题:事务及慢SQL优化全解析
  • 今天聊聊支付里的三个小概念:同名充值、非同代付和 D0。
  • 第0记 cutlass 介绍及入门编程使用
  • Go初级之五:结构体与方法
  • 【leetcode】114. 二叉树展开为链表
  • 【Rust】 6. 字符串学习笔记
  • app怎么防止被攻击被打有多少种防护方式?
  • 税务岗位能力提升培训课程推荐
  • 达梦数据库-数据缓冲区 (二)
  • 【Flask】测试平台开发,产品管理实现编辑功能-第六篇
  • 接吻数问题:从球体堆叠到高维空间的数学奥秘