二叉树OJ(C)

文章目录

  • 1.单值二叉树
    • 1.1法一:无返回值
    • 1.2法二:有返回值
  • 2.相同的树
  • 3.对称二叉树
  • 4.二叉树的前序遍历
  • 5.二叉树的中序遍历
  • 6.二叉树的后序遍历
  • 7.另一棵树的子树
  • 8.二叉树遍历

1.单值二叉树

在这里插入图片描述

1.1法一:无返回值

struct TreeNode 
{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
 };
 
bool flag = true;
void PreOrderCompare(struct TreeNode* root, int val)
{
    //递归过程中 遇NULL 或flag已变假 返回上一层
    if (root == NULL || flag == false)
        return;
    //遇非单值 更新flag 返回上一层
    if (root->val != val)
    {
        flag = false;
        return;
    }
    //结点数据相等 继续遍历
    PreOrderCompare(root->left, val);
    PreOrderCompare(root->right, val);
}

bool isUnivalTree(struct TreeNode* root)
{
    if (root == NULL)
        return true;
    else
    {
        //OJ题目会用程序测试多组样例
        //若上个样例flag变为false 这里就会出错
        //同时也提醒我们要慎用全局变量
        flag = true;
        PreOrderCompare(root, root->val);
        return flag;
    }
}

1.2法二:有返回值

根与左子树、右子树比较 不断递归

struct TreeNode 
{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
 };

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);
}

2.相同的树

在这里插入图片描述

struct TreeNode 
{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
 };

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
    if (p == NULL && q == NULL)
        return true;
    if (p == NULL || q == NULL)
        return false;
    if (p->val != q->val)
        return false;
    return isSameTree(p->left, q->left)
        && isSameTree(p->right, q->right);
}

3.对称二叉树

在这里插入图片描述

struct TreeNode 
{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
 };

bool isSymmetricSubTree(struct TreeNode* root1, struct TreeNode* root2)
{
    if (root1 == NULL && root2 == NULL)
        return true;
    if (root1 == NULL || root2 == NULL)
        return false;
    if (root1->val != root2->val)
        return false;
    return isSymmetricSubTree(root1->left, root2->right)
        && isSymmetricSubTree(root1->right, root2->left);
}


bool isSymmetric(struct TreeNode* root)
{
    if (root == NULL)
        return true;
    return isSymmetricsubTree(root->left, root->right);
}

4.二叉树的前序遍历

在这里插入图片描述

struct TreeNode 
{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
 };

//计算树的结点个数
int TreeSize(struct TreeNode* root)
{
    return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}
//前序遍历
void preorder(struct TreeNode* root, int* a, int* i)
{
    if (root == NULL)
        return;
    a[(*i)++] = root->val;
    preorder(root->left, a, i);
    preorder(root->right, a, i);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    //调用TreeSize函数决定开多大的空间
    *returnSize = TreeSize(root);
    //开空间
    int* a = (int*)malloc(*returnSize * sizeof(int));

    //若在子函数用局部变量i -- 在下一层递归改变i后 -- 返回到上一层用的仍是旧i -- 出现错误
    int i = 0;
    preorder(root, a, &i);
    return a;
}

5.二叉树的中序遍历

在这里插入图片描述

struct TreeNode
{
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
};

int TreeSize(struct TreeNode* root)
{
    return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}
void inorder(struct TreeNode* root, int* a, int* i)
{
    if (root == NULL)
        return;
    inorder(root->left, a, i);
    a[(*i)++] = root->val;
    inorder(root->right, a, i);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize)
{
    *returnSize = TreeSize(root);
    int* a = (int*)malloc(*returnSize * sizeof(int));
    int i = 0;
    inorder(root, a, &i);
    return a;
}

6.二叉树的后序遍历

在这里插入图片描述

struct TreeNode
{
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
};

int TreeSize(struct TreeNode* root)
{
    return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}
void posorder(struct TreeNode* root, int* a, int* i)
{
    if (root == NULL)
        return;
    posorder(root->left, a, i);
    posorder(root->right, a, i);
    a[(*i)++] = root->val;
}
int* posorderTraversal(struct TreeNode* root, int* returnSize)
{
    *returnSize = TreeSize(root);
    int* a = (int*)malloc(*returnSize * sizeof(int));
    int i = 0;
    posorder(root, a, &i);
    return a;
}

7.另一棵树的子树

在这里插入图片描述

struct TreeNode 
{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
 };

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
    if (p == NULL && q == NULL)
        return true;
    if (p == NULL || q == NULL)
        return false;
    if (p->val != q->val)
        return false;
    return isSameTree(p->left, q->left)
        && isSameTree(p->right, q->right);
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{
    if (root == NULL)
        return false;
    if (isSameTree(root, subRoot))
        return true;
    return isSubtree(root->left, subRoot)
        || isSubtree(root->right, subRoot);
}

8.二叉树遍历

在这里插入图片描述

typedef char BTDataType;
typedef struct BinaryTreeNode
{
    struct BinaryTreeNode* left;
    struct BinaryTreeNode* right;
    BTDataType data;
}BTNode;

//创建新结点
BTNode* CreatNode(BTDataType x)
{
    BTNode* node = (BTNode*)malloc(sizeof(BTNode));
    assert(node);

    node->data = x;
    node->left = NULL;
    node->right = NULL;

    return node;
}

//建树
BTNode* CreateTree(char* str, int* i)
{
    if (str[*i] == '#')
    {
        (*i)++;
        return NULL;
    }

    //创建结点
    BTNode* root = CreatNode(str[(*i)++]);
    //连接子树
    root->left = CreateTree(str, i);
    root->right = CreateTree(str, i);

    return root;
}

int main() 
{
    char str[100] = { 0 };
    scanf("%s", str);
    int i = 0;
    BTNode* root = CreateTree(str, &i);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/61673.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker端口映射详解(随机端口、指定IP端口、随意ip指定端口、指定ip随机端口)

目录 docker端口映射详解 一、端口映射概述: 二、案例实验: 1、-P选项,随机端口 2、使用-p可以指定要映射到的本地端口。 Local_Port:Container_Port,任意地址的指定端口 Local_IP:Local_Port:Container_Port 映射到指定地…

Java设计模式之工厂设计模式

简介 工厂模式是一种常见的设计模式,用于创建对象的过程中,通过工厂类来封装对象的创建过程。其核心思想是将对象的创建和使用分离,从而降低耦合度,提高代码的可维护性和可扩展性。工厂模式通常包括三种类型:简单工厂…

探索国产嵌入式Python解决方案的方法(开源)

大家好,今天我们要介绍一款适用于单片机的嵌入式Python开源项目 -- PikaPython。 第一:嵌入式Python的发展趋势 在嵌入式领域软硬件的发展趋势中,硬件的成本日益降低,性能逐渐提升。这种趋势使得Python在芯片上的运行难度已经大大…

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 4

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

物联网平台使用笔记

阿里云的IOT平台限制了50个设备。排除 移动云的限制较少,这里试用下。 创建完产品,接入设备后。使用MQTT客户端测试 其中client id 为设备id, username 为产品id, password 可以使用设备调试那里生成的。或使用官方token.exe 生成…

7.1.tensorRT高级(2)-使用openvino进行onnx的模型推理过程

目录 前言1. openvino2. 补充知识总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-使用 openvino 进行 onnx…

ChatGPT3.5——AI人工智能是个什么玩意?

ChatGPT3.5——AI人工智能 AI人工智能什么是AI?AI有什么过人之处AI有什么缺点 AI的发展AI的发展史中国是如何发展AI的 AI六大要素感知理解推理学习交互 ChatCPT-3.5GPT-3.5的优势在哪里GPT-3.5的风险GPT-4骗人事件 AI人工智能 AI,就像是一位超级聪明的机…

地级市经济增长质量指数及原始数据(2006-2018年)

二十大报告强调,高质量发展是全面建设社会主义现代化国家的首要任务。研究表明,知识产权示范城市建设显著提高了城市经济增长质量,且这种促进作用具有持续性,地方政府财政支出偏向的改变以及知识产权司法保护和行政保护力度的提升…

关系型数据库的设计

范式 关系 注意:根据阿里开发规范,不再设置数据库的外键,在应用层保证外键逻辑即可 数据库设计 1:1 1:n 设想学生-班级案例,若在班级中保存所有学生的主键,则表长不好预测,表的数据亢余。 所以是在多的…

Maven设置阿里云路径(防止加载过慢)

<?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding …

【雕爷学编程】Arduino动手做(184)---快餐盒盖,极低成本搭建机器人实验平台3

吃完快餐粥&#xff0c;除了粥的味道不错之外&#xff0c;我对个快餐盒的圆盖子产生了兴趣&#xff0c;能否做个极低成本的简易机器人呢&#xff1f;也许只需要二十元左右 知识点&#xff1a;轮子&#xff08;wheel&#xff09; 中国词语。是用不同材料制成的圆形滚动物体。简…

外卖多门店小程序开源版开发

外卖多门店小程序开源版开发 外卖多门店小程序开源版的开发可以按照以下步骤进行&#xff1a; 确定需求&#xff1a;明确外卖多门店小程序的功能和特点&#xff0c;包括用户注册登录、浏览菜单、下单支付、订单管理等。技术选型&#xff1a;选择适合开发小程序的技术框架&…

Pytest学习教程_测试报告生成pytest-html(三)

前言 pytest-html 是一个用于生成漂亮的 HTML 测试报告的 pytest 插件。它可以方便地将 pytest 运行的测试结果转换为易于阅读和理解的 HTML 报告&#xff0c;提供了丰富的测试结果展示功能和交互性。 一、安装 # 版本查看命令 pytest版本&#xff1a; pytest --version pyte…

Kubernetes 整体架构介绍

架构图 Kubernetes 主要由以下几个核心组件组成&#xff1a; etcd 保存了整个集群的状态&#xff1b;kube-apiserver 提供了资源操作的唯一入口&#xff0c;并提供认证、授权、访问控制、API 注册和发现等机制&#xff1b;kube-controller-manager 负责维护集群的状态&#xf…

SpringBoot 升级内嵌Tomcat

SpringBoot 更新 Tomcat 最近公司的一个老项目需要升级下Tomcat&#xff0c;由于这个项目我完全没有参与&#xff0c;所以一开始我以为是一个老的Tomcat项目&#xff0c;升级它的Tomcat依赖或者是Tomcat容器镜像&#xff0c;后面发现是一个SpringBoot项目&#xff0c;升级的是…

Rpc异步日志模块

Rpc异步日志模块作用 在一个大型分布式系统中&#xff0c;任何部署的分布式节点都可能发生崩溃&#xff0c;试想如果用普通的办法&#xff0c;即先排查哪个节点down掉了&#xff0c;找到down掉的节点后采取调试工具gdb调试该节点&#xff0c;进而排查宕机的原因。这中排查方法…

考研408 | 【计算机网络】物理层

导图&#xff1a; 一、通信基础 基本概念&#xff1a; 物理层接口特性&#xff1a;物理层解决如何在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。 物理层主要任务&#xff1a;确定与传输媒体接口有关的一些特性 典型的数据通信模型 数据通…

PLL 的 verilog 实现

锁相环&#xff08;PLL&#xff09;是一种常用的频率、相位追踪算法&#xff0c;在信号解调、交流并网等领域有着广泛的应用。本文对全数字锁相环的原理进行介绍&#xff0c;随后给出 verilog 实现及仿真。 PLL 锁相原理 锁相环结构如下图所示&#xff0c;主要由鉴相器、环路滤…

4.DNS和负载均衡

文章目录 coreDNS概念部署croeDNS测试 kubernetes多master集群结构master节点部署 负载均衡配置部署nginx做四层反向代理安装高可用 keepalivednginx监控脚本修改k8s中组件的配置文件 coreDNS 概念 coreDNS是kubernetes的默认DNS实现。可以为集群中的service资源创建一个资源名…

【Unity3D】消融特效

1 前言 选中物体消融特效中基于 Shader 实现了消融特效&#xff0c;本文将基于 Shader Graph 实现消融特效&#xff0c;两者原理一样&#xff0c;只是表达方式不同&#xff0c;另外&#xff0c;选中物体消融特效中通过 discard 丢弃片元&#xff0c;本文通过 alpha 测试丢弃片元…