二叉树经典例题

前言:

本文主要讲解了关于二叉树的简单经典的例题。

因为二叉树的特性,所以关于二叉树的大部分题目,需要利用分治的思想去递归解决问题。

分治思想:

把大问题化简成小问题(根节点、左子树、右子树),返回条件就是最小规模的子问题

一、二叉树中结点的个数

思路:

采用分而治之的思想, 先访问左子树,再访问右子树,然后再加上自己的个数也就是1。

原码:

//采用分治的思想去解决
int TreeSize(BTNode* root)
{return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;/*if (root == NULL)return 0;else{return TreeSize(root->left) + TreeSize(root->right) + 1;}*/
}

二、二叉树中叶子结点的个数

思路:

分为三个判断条件。

  1. 如果是空结点,就返回0
  2. 如果是叶子结点就返回1
  3. 不满足上述两种情况,就继续访问左子树+右子树 

原码:

int TreeLeafSize(BTNode* root)
{if (root == NULL)return 0;if (root->left == NULL && root->right == NULL)return 1;return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

三、求第k层的结点个数

思路:

当前树的第k层 = 左子树的k-1层 + 右子树的k-1层,以此类推

当k == 1时,如果不为空结点,就返回1,如果是空结点就返回0。

原码:

int TreeKLevel(BTNode* root, int k)
{assert(k > 0);if (root == NULL)return 0;if (k == 1){return 1;}return TreeKLevel(root->left, k - 1)+ TreeKLevel(root->right, k - 1);
}

四、判断单值二叉树

965. 单值二叉树

思路:

首先明确等号具有传递性,只要根节点和右节点相等,然后根节点与左结点相等,就说明这颗小树就是单值。

并且这是前序遍历,先遍历根节点,如果根节点不是单值二叉树,那么就没有必要去遍历后面的。

这点可以利用&&与操作符实现,与操作符的特性是只要前者是假,后面就不会执行

原码:

bool isUnivalTree(struct TreeNode* root){//采用前序的思想//利用等于号的传递性if(root == NULL)return true;//跟左节点比较    if(root->left){if(root->val != root->left->val)return false;}//跟右结点比较if(root->right){if(root->val != root->right->val)return false;}return isUnivalTree(root->left) && isUnivalTree(root->right);
}

五、销毁二叉树

思路:

采用后序遍历,防止先销毁根节点,导致左右节点找不到了

原码:

void DestroryTree(BTNode* root)
{//递归必须要有判断条件if (root == NULL)return;//需要后序遍历,不然先销毁根节点,左右子树就找不到了DestroryTree(root->left);DestroryTree(root->right);free(root);root = NULL;

六、在二叉树中根据值搜索结点

思路:

可以直接采取前序遍历,

  1. 最小子问题就是当结点为空时返回空
  2. 结点的值就是寻找的值就返回该节点
  3. 不满足上述条件,就继续递归遍历,先左子树再右子树,如果左子树已经找到结点,直接返回

原码:

BTNode* TreeFind(BTNode* root, int x)
{if (root == NULL)return NULL;if (root->val == x)return root;BTNode* ret = TreeFind(root->left, x);if (ret != NULL)return ret;return TreeFind(root->right, x);
}

七、检查两颗树是否相同

100. 相同的树

思路:

采用分治的思想,把问题逐步缩小,最小子问题就是两个结点是否相同

  1. 我们首先要清楚是不是空树
  2. 然后如果一个为空,另一个不为空
  3. 当结点都存在时,再判断结点的值是否相等

原码:

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

八、对称二叉树

​​​​​​101. 对称二叉树

思路;

本题跟上一题两颗二叉树是否相同非常相似,只需要将比较的结点改变顺序,因为是对称,所以左节点要跟右节点相等。

原码:

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->right) && isSameTree(p->right,q->left);
}bool isSymmetric(struct TreeNode* root){return isSameTree(root->left,root->right);
}

九、另一棵树的子树

572. 另一棵树的子树

思路:

这道题也是判断相同树的衍生题目,当根节点与subTree的根节点相同时,可以判断两颗树是否相同,并利用||来判断。

原码:

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){//防止递归到空结点,造成非法访问if(root == NULL)return false;//相同前提是根节点要一致if(root->val == subRoot->val){if(isSameTree(root,subRoot))return true;}//只要发现相同,没有必要进行下面的比较,所以是||return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}

十、二叉树的最大深度

104. 二叉树的最大深度

思路:

我们分别求出左子树和右子树的深度,再返回较大的值。

注意:

我们不能将代码写成上面的形式,首先定位上面的代码是非常差的代码,返回值返回的时候会重新进入函数计算,并且是每一个结点!因此我们需要提前将返回值保存起来,将值进行比较去返回。

原码:

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

十一、二叉树的前序遍历

​​​​​​144. 二叉树的前序遍历

思路:

本题并不是简单的递归求解,需要根据题目要求,因为我们用C语言进行求解。

  1. 数组的大小需要我们先自己求这颗树的结点大小,单独开辟一个函数去求解
  2. 我们不能递归自己的函数,因为每次递归都需要动态开辟一个新的数组,因此还需要重新创建一个函数去解决
  3. 注意新的函数中数组下标i的值需要传地址,因为递归过程中有很多i,直接传地址

原码:

//先提前算好二叉树结点的个数,便于开辟动态数组的大小
int TreeSize(struct TreeNode* root)
{return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}void preorder(struct TreeNode* root,int* arr,int* i)//传数组下标的地址,避免使用全局变量的麻烦
{if(root == NULL){return;}arr[(*i)] = root->val;(*i)++;preorder(root->left,arr,i);preorder(root->right,arr,i);
}int* preorderTraversal(struct TreeNode* root, int* returnSize){*returnSize = TreeSize(root);int *arr = (int*)malloc(sizeof(int)*(*returnSize));//需要再创建一个函数用来递归,不然每次调用该函数进行递归都会动态开辟int i = 0;preorder(root,arr,&i);return arr;
}

十二、通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树

注意:

*pi++  (*pi)++两者含义不同,为了避免优先级的问题,我们直接加上括号!

原码:

BTNode* BinaryTreeCreate(char* str, int* pi)
{if (str[*pi] == '#'){(*pi)++;return NULL;}BTNode* root = (BTNode*)malloc(sizeof(BTNode) * 1);root->val = str[*pi];(*pi)++;root->left = BinaryTreeCreate(str, pi);root->right = BinaryTreeCreate(str, pi);return root;
}

十三、二叉树的层序遍历

涉及到层序遍历,大部分情况下需要借助队列进行求解。

思路:

上一层带下一层,先进先出。

原码:

十四、判断是否是完全二叉树

思路:

利用层序遍历,如果非空结点是连续的,就是完全二叉树。

如果非空结点是不连续的,中间有空结点,就是非完全二叉树。

原码:

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

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

相关文章

91、Redis - 事务 与 订阅-发布 相关的命令 及 演示

★ 事务相关的命令 Redis事务保证事务内的多条命令会按顺序作为整体执行,其他客户端发出的请求绝不可能被插入到事务处理的中间, 这样可以保证事务内所有命令作为一个隔离操作被执行。 Redis事务同样具有原子性,事务内所有命令要么全部被执…

k8s集群-6(daemonset job cronjob控制器)

Daemonset 一个节点部署一个节点 当有节点DaemonSet 确保全部 (或者某些) 节点上运行一个 Pod 的副本。加入集群时,也会为他们新增一个 Pod 。当有节点从集群移除时,这些Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。 DaemonSet 的典型用…

第81步 时间序列建模实战:Adaboost回归建模

基于WIN10的64位系统演示 一、写在前面 这一期,我们介绍AdaBoost回归。 同样,这里使用这个数据: 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndr…

【Linux】TCP的服务端(守护进程) + 客户端

文章目录 📖 前言1. 服务端基本结构1.1 类成员变量:1.2 头文件1.3 初始化:1.3 - 1 全双工与半双工1.3 - 2 inet_aton1.3 - 3 listen 2. 服务端运行接口2.1 accept:2.2 服务接口: 3. 客户端3.1 connect:3.2 …

多卡片效果悬停效果

效果展示 页面结构 从页面的结构上看&#xff0c;在默认状态下毛玻璃卡片是有层次感的效果叠加在一起&#xff0c;并且鼠标悬停在卡片区域后&#xff0c;卡片整齐排列。 CSS3 知识点 transform 属性的 rotate 值运用content 属性的 attr 值运用 实现页面整体布局 <div …

【Linux】Linux常用命令—文件管理(下)

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

Facebook Delos 中的虚拟共识协议

背景 Facebook 的软件系统栈一般包括两层&#xff1a;上层是数据平面&#xff0c; 下层是控制平面。 facebook software stack 数据平面包括大量的服务&#xff0c;他们需要存储和处理海量数据。控制平面用来支撑数据平面&#xff0c;起到一些控制作用&#xff1a;调度、配置…

便捷方式定制真人3D手办,易模小程序即将上线

这个十月一&#xff0c;您是否在商场或者一些门店门前“偶遇”了惟妙惟肖的等比例缩小的真人手办&#xff1f;是否心动想要制作一个却因犹豫不决而就此错过&#xff1f;现在&#xff0c;更便捷的真人手办定制方法就在你的微信里~【易模真人手办定制】小程序即将上线&#xff01…

苹果ios应用ipa文件签名为什么需要签名才能上架?有没有别的方式替代苹果签名?

近年来&#xff0c;苹果设备的普及程度逐渐加深&#xff0c;随之而来的是越来越多的应用程序涌入了苹果的应用商店。为了保障用户设备和数据的安全&#xff0c;以及减少恶意程序和恶意软件的传播&#xff0c;苹果公司实行了一套严格的应用安全机制&#xff0c;其中就包括应用程…

mysql面试题18:MySQL中为什么要用 B+树,为什么不用二叉树?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL中为什么要用 B+树,为什么不用二叉树? MySQL数据库索引是一种数据结构,用于提高数据查询的效率。在MySQL中,常用的索引类型包括B+树索引…

Integrity Plus for Mac,保障网站链接无忧之选

在如今数字化的时代&#xff0c;网站链接的完整性对于用户体验和搜索引擎排名至关重要。如果您是一位网站管理员或者经常需要检查网站链接的人&#xff0c;那么Integrity Plus for Mac&#xff08;Integrity Plus&#xff09;将成为您最好的伙伴。 Integrity Plus是一款专业的…

[软件工具]opencv-svm快速训练助手教程解决opencv C++ SVM模型训练与分类实现任务支持C# python调用

opencv中已经提供了svm算法可以对图像实现多分类&#xff0c;使用svm算法对图像分类的任务多用于场景简单且对时间有要求的场景&#xff0c;因为opencv的svm训练一般只需要很短时间就可以完成训练任务。但是目前网上没有一个工具很好解决训练问题&#xff0c;大部分需要自己编程…

Java数据结构————队列

一 、队列 在Java中&#xff0c;Queue是个接口&#xff0c;底层是通过链表实现的。 只允许在一端进行插入数据操作&#xff0c; 在另一端进行删除数据操作的特殊线性表&#xff0c; 队列具有先进先出FIFO(First In First Out) 。 入队列&#xff1a; 进行插入操作的一端称为…

游戏素材网站

OpenGameArt.org&#xff1a;这是一个提供免费游戏素材的社区平台&#xff0c;包括角色、背景、音效、音乐等各种类型的素材。你可以在 https://opengameart.org/ 上找到大量的免费资源。 Kenney.nl&#xff1a;Kenney 是一个知名的游戏开发者&#xff0c;他提供了大量的免费 …

十天学完基础数据结构-第六天(树(Tree))

树的基本概念 树是一种层次性的数据结构&#xff0c;它由节点组成&#xff0c;这些节点按照层次关系相互连接。树具有以下基本概念&#xff1a; 根节点&#xff1a;树的顶部节点&#xff0c;没有父节点。 子节点&#xff1a;树中每个节点可以有零个或多个子节点。 叶节点&am…

Linux查看防火墙状态

1.CentOS查看防火墙 firewall-cmd --state 显示状态 2.Ubuntu查看防火墙 sudo ufw status

js判断数据类型、toString和valueOf区别,类型转换、不同类型间的运算、判断相等

目录 判断数据类型 运算符 typeof&#xff1a;判断 基本数据类型 typeof nullObject 类型标签均为000 实例 instanceof 构造函数&#xff1a;判断原型链&#xff0c;和isPrototypeOf 方法 构造函数.prototype.isPrototypeOf(实例) &#xff1a;判断原型链 (数据).const…

zookeeper选举机制

全新集群选举 zookeeper 全新集群选举机制网上资料很多说法很模糊&#xff0c;仔细思考了一下&#xff0c;应该是这样 得到票数最多的机器>机器总数半数 具体启动过程中的哪个节点成为 leader 与 zoo.cfg 中配置的节点数有关&#xff0c;下面以3个举例 选举过程如下 server…

基于SpringBoot的高考志愿填报系统

功能需求&#xff1a; 1.用户可以根据自己的院校类型、办学类型、层次类型、地域等因素筛选高校。 2.用户可以查询到所选高校的基本信息&#xff0c;包括学校的概况、历史沿革、办学特色、学院设置、师资力量、科研实力等。 3.用户可以查询到所选高校的高校开设专业&#xff0c…

模块化编程+LCD1602调试工具——“51单片机”

各位CSDN的uu们你们好呀&#xff0c;小雅兰又来啦&#xff0c;刚刚学完静态数码管显示和动态数码管显示&#xff0c;感觉真不错呢&#xff0c;下面&#xff0c;小雅兰就要开始学习模块化编程以及LCD1602调试工具的知识了&#xff0c;让我们进入51单片机的世界吧&#xff01;&am…