二叉树理论和题目

devtools/2024/9/22 19:58:09/

二叉树的种类

在我们解题过程中二叉树有两种主要的形:满二叉树和完全二叉树。

满二叉树

满二叉树:如果一棵二叉树只有度为0的结点和度为 2 的结点,并且度为 0 的结点在同一层上,则这棵二叉树为满二叉树。

这棵二叉树为满二叉树,也可以说深度为 k,有2^k-1个节点的二叉树。

完全二叉树

完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层(h从1开始),则该层包含1~ 2^(h-1)个节点。

二叉搜索树

前⾯介绍的树,都没有数值的,而二叉搜索树是有数值的了,二叉搜索树是⼀个有序树。

若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

它的左、右子树也分别为二叉排序树

二叉树的存储方式

链式存储

顺序存储

如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩⼦就是 i * 2 + 2。

二叉树的遍历方式

二叉树的递归顺序

二叉树的迭代遍历

前序遍历

前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。

为什么要先加入右孩子,再加入左孩子呢?因为这样出栈的时候才是中左右的顺序。

中序遍历

分析一下为什么刚刚写的前序遍历的代码,不能和中序遍历通用呢,因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,因为要访问的元素和要处理的元素顺序是一致的,都是中间节点。

那么再看看中序遍历,中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进result数组中),这就造成了处理顺序和访问顺序是不一致的。

那么在使用迭代法写中序遍历,就需要借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素。

后序遍历

叉树层序遍历

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

题目一

这是二叉搜索树吗?

代码:

# include <stdio.h>struct node
{int val;struct node * left;struct node * right;
};int n;
int num[1000];int treemade(int l, int r, struct node* root)//二叉搜索树
{if (l > r)return 1;int stand = num[l];int help = l + 1;while (help < r && num[help] < stand)help++;int mid = help;while (help < r && num[help] >= stand)help++;if (help < r )//若大与小与部分拼不成一个完整序列,则说明不符合return 0;root = (struct node*) malloc(sizeof(struct node));root->val = num[l];root->left = NULL;root->right = NULL;return (treemade(l+1, mid-1, root->left) && treemade(mid, r, root->right));}void cmp(struct node* root, int cnt)
{if (root->left != NULL)cmp(root->left, cnt+1);if (root->right != NULL);cmp(root->right, cnt+1);if (cnt == 0)  //特判printf("%d", root->val);elseprintf("%d ", root->val);
}int main()
{scanf("%d", &n);for (int i=0; i<n; ++i)scanf("%d");struct node* root;root = NULL;if (treemade(0, n, root));//判断能否建成二叉搜索树{printf("YES\n");cmp(root);}}

题目二

解题

在后序遍历序列中,根节点总是在最后一个位置,而在中序遍历序列中,根节点将序列分为左右两部分,分别对应左子树和右子树。

因此,我们可以利用两个数组的信息,递归构建二叉树,然后再进行层序遍历。

# include <stdio.h>
int n;
int num1[31];
int num2[31];struct node
{int val;struct node* left;struct node* right;
};void treemade(int l, int r, struct node* root, int k)
{int flag = 0;if (k < 0)return;int help = num1[k];int mid;for (int i=l; i<=r; ++i){if (num[i] == help){mid = i;flag = 1;break;}}if (flag == 1){root = (struct node*)malloc(sizeof(struct node));root->val = help;root->left = NULL;root->right = NULL;	treemade(l, mid-1, root->left, k-1);treemade(mid+1, r, root->right, k-1);}else{treemade(l, r, root, k-1);}
}int main()
{scanf("%d", &n);for (int i=0; i<n; ++i)scanf("%d", &num1[i]);for (int i=0; i<n; ++i)scanf("%d", &num2[i]);int k = n-1;struct node* root = NULL;}


http://www.ppmy.cn/devtools/22587.html

相关文章

常用算法代码模板 (3) :搜索与图论

AcWing算法基础课笔记与常用算法模板 (3) ——搜索与图论 常用算法代码模板 (1) &#xff1a;基础算法 常用算法代码模板 (2) &#xff1a;数据结构 常用算法代码模板 (3) &#xff1a;搜索与图论 常用算法代码模板 (4) &#xff1a;数学知识 文章目录 0 搜索技巧1 树与图的存…

企业如何保证内部传输文件使用的工具是安全的?

企业内部文件的频繁交换成为了日常运营不可或缺的一环。然而&#xff0c;随着数据量的爆炸式增长和网络攻击手段的日益复杂&#xff0c;内网文件传输的安全隐患也日益凸显&#xff0c;成为企业信息安全的薄弱环节。本文将探讨内网文件传输的安全风险、企业常用的防护措施。 内网…

算法学习(5)-图的遍历

目录 什么是深度和广度优先 图的深度优先遍历-城市地图 图的广度优先遍历-最少转机 什么是深度和广度优先 使用深度优先搜索来遍历这个图的过程具体是&#xff1a; 首先从一个未走到过的顶点作为起始顶点&#xff0c; 比如以1号顶点作为起点。沿1号顶点的边去尝试访问其它未…

纯血鸿蒙APP实战开发——评论组件案例实现

介绍 评论组件在目前市面上的短视频app中是一种很常见的场景&#xff0c;本案例使用全局状态保留能力弹窗来实现评论组件。点击评论按钮弹出评论组件&#xff0c;点击空白处隐藏该组件&#xff0c;再次点击评论按钮则会恢复上一次浏览的组件状态。 效果图预览 使用说明 点击…

蓝桥杯单片机省赛——第八届“基于单片机的电子钟程序设计与调试”程序部分

往期回顾 第三届蓝桥杯单片机省赛 第四届蓝桥杯单片机省赛 第五届蓝桥杯单片机省赛 第六届蓝桥杯单片机省赛 第七届蓝桥杯单片机省赛 文章目录 往期回顾一、前期准备二、代码详情1.基础代码蜂鸣器/继电器/led/定时器之类的代码 2.按键详解按键写法讲解 3.驱动的处理驱动写法讲…

Eureka基础知识

Eureka是Netflix开源的一个服务发现框架&#xff0c;主要用于构建基于微服务架构的应用程序。它允许服务实例自动注册和发现&#xff0c;从而实现了服务之间的协调和通信。Eureka的设计目标是简单、可靠和高可用的服务注册和发现。 在微服务架构中&#xff0c;Eureka扮演了两个…

罗德与施瓦茨矢量网络分析仪ZNB20相位一致性

矢量网络分析仪(VNA)是电子测量领域中非常重要的一类仪器,广泛应用于射频和微波电路的测试与分析。其中,德国罗德与施瓦茨公司生产的ZNB20型号是一款性能出色的矢量网络分析仪,深受业内人士的青睐。本文将重点介绍ZNB20在相位测量方面的特点和优势,为用户提供全面的使用参考。 …

linux的压缩与备份

一、打包 格式&#xff1a;tar -参数 <打包文件名> <打包的目标> 作用&#xff1a;将文件或者目录打包 重要参数&#xff1a;-f 使用归档文件&#xff0c;一定要加上这个参数 -c 新建打包文件 -x 解包文件 -t 可以不用解包就能查看包文件内容 -v 打包和解包时显…