二叉树oj

文章目录

   1. 单值二叉树

   2. 检查两颗树是否相同。

   3. 对称二叉树。

   4. 二叉树的前序遍历。

   5. 另一颗树的子树。

   6.二叉树的构建及遍历。

   7.判断一颗二叉树是否是平衡二叉树。

   8.翻转二叉树。


文章内容

   1. 单值二叉树

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路:此题为二叉树遍历问题。首先假设根节点的值作为标准值,在遍历的过程中如果有别的节点的值与其不相等则为假。

          递归的返回条件:

        第一:当目前节点为空的时候我们返回真。

        第二:当目前节点的左右孩子不为空,并且值左右孩子的值不等于根的值的时候我们返回假。

        如果当前节点的值不符合以上两种情况,则继续往下遍历。

 

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. 检查两颗树是否相同。

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台         力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

         思路:我们同时从根节点出发,然后来对比他们的左右子树,左右子树的状态和值要相同,才能返回真。

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.对称二叉树。

   力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

       

   思路:首先要判断两个根节点是否为空,如果为空,然后返回真,然后就是判断两颗树是不是相同的子树。

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->right , root2->left) &&isSymmetricsubTree(root1->left,root2->right);}bool isSymmetric(struct TreeNode* root){if(root == NULL){return true;}return isSymmetricsubTree(root->left , root->right);}

    4. 二叉树的前序遍历。

        力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路: 输出的结果是一个数组,所以我们首先要遍历节点的个数,构造与之相同大小的数组。

             堆区开辟内存存储遍历二叉树的,避免函数返回后造成野指针问题。

int Bsize(struct TreeNode*root)
{if(root == NULL){return 0;}return Bsize(root->left)+Bsize(root->right)+1;}void postorder(struct TreeNode* root, int* a,int* i){if(root == NULL){return;}a[(*i)++] = root->val;postorder(root->left,a,i);postorder(root->right,a,i);}int* preorderTraversal(struct TreeNode* root, int* returnSize){int* a,i;*returnSize = Bsize(root);a = (int*)malloc(sizeof(int) * (*returnSize));i=0;postorder(root ,a ,&i );//传递i的地址,传址能改变实参return a;
}

5.另一颗树的子树。

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

 思路:我们分别那root 的左右节点去和subroot 比较他们是否为相同的树。

ool 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;//root为空则不为相同的树}if( isSameTree(root,subRoot)){return true;}return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);}

6.二叉树的构建及遍历。

        二叉树遍历_牛客题霸_牛客网

思路:本题并非力扣上的接口题,我们要自己写主函数,还要创建数组。

 

         程序的逻辑图打开如上,访问到 # 便返回空,再创建新节点之后 pi 已经++,所以创建左子树的便不用再++,本题创建节点的思路和先序遍历的思路是一样的,先创建根节点,然后左子树,然后右子树。

#include <stdio.h>
#include<stdlib.h>typedef char BTDataType;
typedef struct BinaryTreeNode
{struct BinaryTreeNode* left;struct BinaryTreeNode* right;BTDataType data;}BTNode;BTNode* BuyNode(BTDataType x)
{BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));if (newnode == NULL){perror("malloc fail");exit(-1);}newnode->data = x;newnode->left = NULL;newnode->right = NULL;return newnode;
}BTNode* creattree(char a[] , int* i)
{if(a[(*i)] == '#'){(*i)++;return NULL;}BTNode* root = BuyNode(a[(*i)++]);root->left = creattree(a,i);root->right = creattree(a,i);return root;}void inorder(BTNode* root){if(root == NULL){return ;}inorder(root->left);printf("%c ",root->data);inorder(root->right);}int main() {char a[100] = {0};scanf("%s",a);int i = 0;BTNode* root = creattree(a,&i);inorder(root);return 0;
}

7.判断一颗二叉树是否是平衡二叉树。

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

 思路:

        通过算出左右子树的深度,来比较是否为平衡二叉树。

 8.翻转二叉树。

        力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路:交换根的左右节点

 

void reversetree(struct TreeNode* root)
{if(root){struct TreeNode*  tmp = root->left;root->left = root->right;root->right = tmp;reversetree(root->left);reversetree( root->right);}}struct TreeNode* invertTree(struct TreeNode* root){if(root == NULL){return NULL;}reversetree(root);return root;}

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

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

相关文章

Centos 7.6 安装mongodb

以下是在CentOS 7.6上安装MongoDB的步骤&#xff1a; 打开终端并以root用户身份登录系统。 创建一个新的MongoDB存储库文件 /etc/yum.repos.d/mongodb-org-4.4.repo 并编辑它。 sudo vi /etc/yum.repos.d/mongodb-org-4.4.repo在编辑器中&#xff0c;添加下面的内容到文件中并…

云计算在线实训系统建设方案

一、 人工智能与云计算系统概述 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一种模拟人类智能的科学和工程&#xff0c;通过使用计算机系统来模拟、扩展和增强人类的智能能力。人工智能涉及多个领域&#xff0c;包括机器学习、深度学习、自然…

医疗中心管理环境温湿度,这样操作就对了!

随着医疗技术的不断发展&#xff0c;越来越多的医疗设备对于稳定的工作环境要求越来越高&#xff0c;而环境温湿度是影响这些设备性能和可靠性的关键因素之一。 为了确保医疗设备的正常运行和患者的安全&#xff0c;医疗机构越来越倾向于采用精密空调监控系统来维护设备的稳定性…

【业务功能篇76】微服务网关路由predicates断言条件-filters路由转换地址-跨域问题-多级目录树化层级设计-mybatisPlus逻辑删除

业务开发-基础业务-分类管理 启动renren-fast如果出现如下错误 -Djps.track.ap.dependenciesfalse 添加相关配置即可 分类管理 1.后端分类接口 JDK8特性&#xff1a;https://blog.csdn.net/qq_38526573/category_11113126.html 在后端服务中我们需要查询出所有的三级分类信…

# 【三维重建】【深度学习】NeRF代码Pytorch实现--数据加载(中)

【三维重建】【深度学习】NeRF代码Pytorch实现–数据加载(中) 论文提出了一种5D的神经辐射场来作为复杂场景的隐式表示&#xff0c;称为NeRF&#xff0c;其输⼊稀疏的多⻆度带pose的图像训练得到⼀个神经辐射场模型。简单来说就是通过输入同一场景不同视角下的二维图片和相机位…

【java】LinkedList 和 ArrayList的简介与对比

Java LinkedList和 ArrayList 在使用上&#xff0c;几乎是一样的。由于LinkedList是基于双向链表的&#xff0c;会多出list.getFirst();获取头部元素等方法 链表&#xff08;Linked list&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;但是并不会按…

nginx会话保持

ip_hash:通过IP保持会话 作用&#xff1a; nginx通过后端服务器地址将请求定向的转发到服务器上。 将客户端的IP地址通过哈希算法加密成一个数值 如果后端有多个服务器&#xff0c;第一次请求到服务器A&#xff0c; 并在务器登录成功&#xff0c;那么再登录B服务器就要重新…

基于Visual studio创建API项目

API&#xff08;英文全称&#xff1a;Application Programming Interface,中文&#xff1a;应用程序编程接口&#xff09; 为什么要 通过API接口可以与其他软件实现数据相互通信&#xff0c;API这项技术能够提高开发效率。 本文是基于vs2017 .net平台搭建API。希望可以帮助到学…

机器学习:什么是分类/回归/聚类/降维/决策

目录 学习模式分为三大类&#xff1a;监督&#xff0c;无监督&#xff0c;强化学习 监督学习基本问题 分类问题 回归问题 无监督学习基本问题 聚类问题 降维问题 强化学习基本问题 决策问题 如何选择合适的算法 我们将涵盖目前「五大」最常见机器学习任务&#xff1a…

VS Code内存占用过高 - 解决方案

前言 使用VS Code时&#xff0c;其占用的内存可能会急剧增加&#xff0c;从而增加计算机内存的压力&#xff0c;下文介绍如何减少VS Code的内存占用。 通过此方案&#xff0c;本人从3G的内存占用降到了700M的内存占用。 解决方案 打开VS Code的设置&#xff0c;如下图&…

无锁并发:探秘CAS机制的魔力

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 无锁并发&#xff1a;探秘CAS机制的魔力 ⏱️ 创作时间&#xff1a; 2…