[LeetCode]链式二叉树相关题目(c语言实现)

文章目录

  • LeetCode965. 单值二叉树
  • LeetCode100. 相同的树
  • LeetCode101. 对称二叉树
  • LeetCode144. 二叉树的前序遍历
  • LeetCode94. 二叉树的中序遍历
  • LeetCode145. 二叉树的后序遍历
  • LeetCode572. 另一棵树的子树

LeetCode965. 单值二叉树

题目
在这里插入图片描述

Oj链接

思路

一棵树的所有值都是一个值, 那么就可以认为每个结点的左右孩子都和该结点的值相等
将一棵树分为根 左子树 右子树, 如果值不相等直接返回 false

先判断根结点的左右孩子是否和根结点的值一样

  • 如果一样,先判断左子树,再判断右子树,最后返回两结果的逻辑与结果
  • 如果不一样,直接返回false,

代码实现

bool isUnivalTree(struct TreeNode* root)
{if (root == NULL)   return true;if (root->left && root->val != root->left->val)     //如果左子树存在并且值不等, 返回falsereturn false;if (root->right && root->val != root->right->val)   //如果右子树存在并且值不等, 返回falsereturn false;return isUnivalTree(root->left) && isUnivalTree(root->right);   //左子树为单值 && 右子树为单值
}

LeetCode100. 相同的树

题目
在这里插入图片描述

Oj链接

思路

  • 如果两个树都为空, 则两树相等;
  • 如果两个树中只有一个是空, 那么两数必然不相等.
  • 如果两个数都不为空, 则先判断两树的根结点是否值一样.
    • 若一样, 继续递归调用判断左子树和右子树是否都对应相等;
    • 若不一样,直接向上一层返回false

代码实现

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{if (p == NULL && q == NULL) //如果两个结点都是空, 返回true{return true;}if (p == NULL || q == NULL) //在两个结点不同时为空的情况下, 有一个为空直接返回false{return false;}//剩余就只有两结点都不为空的情况了if (p->val != q->val){return false;}return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

LeetCode101. 对称二叉树

题目
在这里插入图片描述

Oj链接

思路
和判断两树是否一样的思路差不多

一个树是对称二叉树的条件就是:

  1. 根结点的左右孩子一样
  2. 左子树的左子树 和 右子树的右子树 一样
  3. 左子树的右子树 和 右子树的左子树 一样

由此对于左右子树的判断我们可以创建一个递归函数, 类似于判断两树是否一样, 函数参数是两个树

  • 如果两个树都是空, 则两树对称
  • 如果两个树中只有一个是空, 则两树不对称
  • 如果两个数都不为空, 则判断 左左和右右是否相等, 左右和右左是否相同

代码实现

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

LeetCode144. 二叉树的前序遍历

LeetCode94. 二叉树的中序遍历

LeetCode145. 二叉树的后序遍历

三题类似,这里直接一起贴上来
题目
二叉树的前序遍历。 Oj链接

二叉树中序遍历 。Oj链接

二叉树的后序遍历 。Oj链接

思路
就拿前序遍历来说, 对于普通打印的前序遍历就不多说了, 相关可以看我的文章:链式二叉树

在这里, 主要是理解题目意思, 首先我们来看题目给的接口函数描述

int* preorderTraversal(struct TreeNode* root, int* returnSize);

函数需要我们将前序遍历的结果存到一个数组当中, 并且将数组返回, 这就需要我们动态开辟一段空间.
int* returnSize表示我们同时要返回二叉树的结点个数, 通过传址调用返回.

  1. 获得二叉数结点个数, 并开辟同样元素个数空间的数组空间
  2. 前序遍历二叉树, 自己创建一个递归函数, 为了方便递归调用来存放数据到数组, 将数组下标传址调用

代码实现

  • 前序遍历
// 二叉树结点个数
int binaryTreeSize(struct TreeNode* root)
{if (root == NULL){return 0;}return 1 + binaryTreeSize(root->left) + binaryTreeSize(root->right);
}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)
{*returnSize = binaryTreeSize(root);int* a = (int*)malloc(sizeof(int) * (*returnSize));int index = 0;preOrder(root, a, &index);return a;
}
  • 中序遍历
int TreeSize(struct TreeNode* root)
{return root == NULL ? 0 : 1 + TreeSize(root->left) + TreeSize(root->right);
}void inOrder(struct TreeNode* root, int* a, int* pi)
{if (root == NULL){return ;}inOrder(root->left, a, pi);a[(*pi)++] = root->val;inOrder(root->right, a, pi);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize)
{*returnSize = TreeSize(root);int* a = (int*)malloc(sizeof(int) * (*returnSize));int index = 0;inOrder(root, a, &index);return a;
}
  • 后序遍历
int TreeSize(struct TreeNode* root)
{return root == NULL ? 0 : 1 + TreeSize(root->left) + TreeSize(root->right);
}void postOrder(struct TreeNode* root, int* a, int* pi)
{if (root == NULL){return;}    postOrder(root->left, a, pi);postOrder(root->right, a, pi);a[(*pi)++] = root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize)
{*returnSize = TreeSize(root);int* a = (int*)malloc(sizeof(int) * (*returnSize));int index = 0;postOrder(root, a, &index);return a;
}

LeetCode572. 另一棵树的子树

题目
在这里插入图片描述

Oj链接

思路

深度搜索每一个结点, 如果结点与subRoot的根结点相同, 则进行判断以这两个结点为根结点的树是否相同

这里需要用到前面用到的判断两个树是否一样的函数代码.

  1. 如果 rootsubRoot 都为空, 则直接返回 true
  2. 如果 rootsubRoot 两个只有有一个为空, 则直接返回 false
  3. 此时只剩下两者都不为空的情况, 深度搜索判断 root 每个结点是否和 subRoot 的根结点一样
  • 如果一样, 则使用 isSameTree进行判断
  • 如果不一样, 继续深度搜索
  1. 最后将左右子树的两个结果经过逻辑或得到结果
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{if (p == NULL && q == NULL) //如果两个结点都是空, 返回true{return true;}if (p == NULL || q == NULL) //在两个结点不同时为空的情况下, 有一个为空直接返回false{return false;}//剩余就只有两结点都不为空的情况了if (p->val != q->val){return false;}return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}// 如果根结点对应的树是subRoot, 则返回true
// 如果不是 寻找左子树有没有
//          寻找右子树有没有
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{if (root == NULL && subRoot == NULL){return true;}if (root == NULL || subRoot == NULL){return false;}if (root->val == subRoot->val){if (isSameTree(root, subRoot)){return true;}}return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分库分表(3)——ShardingJDBC实践

一、ShardingSphere产品介绍 Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。 它们均提供标准化的数据分…

unity操作_光源组件 c#

准备工作 添加资源导入后先不管,现在主要学习自带Directional Light 我们首先创建一个平面Plane 然后重置一下位置 然后创建一个Cube 也重置一下位置然后修改y0.5刚好在这个平面上 ctrl d复制一个Cube 修改位置和旋转角度 给物体一个颜色 接下来创建一个点光源 我们…

安达发|制造业的新趋势:APS排程软件的广泛应用

近年来,随着科技的快速发展,制造业也在逐步实现智能化、自动化。其中,APS排程软件的应用越来越广泛,成为制造业提高生产效率、降低运营成本的重要工具。本文将深入探讨这一现象背后的原因。 制造业是全球经济的重要支柱&#xff0…

【深度学习】UniControl 一个统一的扩散模型用于可控的野外视觉生成

论文:https://arxiv.org/abs/2305.11147 代码:https://github.com/salesforce/UniControl#data-preparation docker快速部署:https://qq742971636.blog.csdn.net/article/details/133129146 文章目录 AbstractIntroductionRelated WorksUniCo…

Java基础——网络编程

网络通信要素一:IP地址或域名 IP作用:给网络中的一台计算机设备做唯一的编号。 IP分类: 方式一: IPv4(占用4个字节)IPv6(占用16个字节) 方式二: 公网地址(万…

layui laydate实现日期选择并禁用指定的时间

最终实现禁用2023-9-26这天的效果 官网地址 日期和时间组件文档 - layui.laydate 下面是实现的代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>layDate快速使用</title><link rel"stylesheet"…

Http请求响应 Ajax 过滤器

10/10/2023 近期总结&#xff1a; 最近学的后端部署&#xff0c;web服务器运行&#xff0c;各种请求响应&#xff0c;内容很多&#xff0c;学的很乱&#xff0c;还是需要好好整理&#xff0c;前面JavaSE内容还没有完全掌握&#xff0c;再加上一边刷题&#xff0c;感觉压力很大哈…

Python接口自动化测试之token参数关联

前言 在做自动化接口测试时&#xff0c;有时候会遇到token的动态关联&#xff0c;例如查询余额接口&#xff0c;需要关联登录接口的token动态值&#xff0c;如何利用python脚本进行接口token关联呢?今天我们爱学习一下吧&#xff01; 一&#xff1a;获取登录接口返回的token…

【Java 进阶篇】CSS 选择器详解

CSS&#xff08;层叠样式表&#xff09;是一种用于描述网页上元素样式的语言。要想有效地使用CSS&#xff0c;了解CSS选择器是至关重要的&#xff0c;因为它们允许你选择要应用样式的HTML元素。在本文中&#xff0c;我们将详细介绍CSS选择器的各种类型和用法&#xff0c;以便你…

【每日一记】OSPF区域划分详讲、划分区域的优点好处

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;喜欢编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc…

3d环形图开发(vue3+vite+ts)

开发效果&#xff08;待完善&#xff09;&#xff1a; 技术支持&#xff1a; Echarts echarts-gl 安装&#xff1a; 注&#xff1a;echarts与echarts-gl版本需对应&#xff0c;可参考官网 pnpm add echarts4.9.0 echarts-gl1.1.2 组件封装&#xff1a; <template><…

归纳所猜半结论推出完整结论:CF1592F1

https://www.luogu.com.cn/problem/CF1592F1 场上猜了个结论&#xff0c;感觉只会操作1。然后被样例1hack了。然后就猜如果 ( n , m ) (n,m) (n,m) 为1则翻转4操作&#xff0c;被#14hack了。然后就猜4操作只会进行一次&#xff0c;然后就不知道怎么做下去了。 上面猜的结论都…