11.9树的表示方法(孩子,父亲,孩子兄弟),树、森林的遍历,一些操作,决策树,前缀树

父亲表示法 

优缺点:利用了树中除根结点外每个结点都有唯一的父节点这个性质,很容易找到树根,但是找孩子需要遍历整个线性表。

最近公共祖先

第一种方法,找路径然后比较

如果是搜索树,可以二分查找

不是,就dfs

第二种,不找路径

如果在同一层,那么就同步移动

如果不在同一层,

如果不在同一层,就让层数深的上升到层数浅的同一层,之后就是回到第一种情况,判断只要不相同,那么就接着同步往上走

经过这步,tx,ty同步向上,一个到根节点后,那么另一个还没到,它到根节点的距离,就是x与y的距离差值,如果ty<0,那就说明y先到根,y处于浅层,交换一下,就是让x处于浅层,y处于深层,并把ty赋值为tx,此时ty到根的距离就代表y和x之间的距离差

这步就是把深层结点往浅层结点走,Ty到根节点时,y就到了和x的同一层

孩子表示法

struct node
{
char data;
tree child[m]//m个孩子
};
tree t;

缺陷:只能从父结点遍历到子结点,不能从某个子结点返回到父结点。

孩子兄弟表示法

struct node{
char data;
tree firstchild,next;
}

左孩子,右兄弟

树与二叉树的转换

森林与二叉树转换

查找树的指定结点

左孩子,右兄弟,所以先找自己,自己的数据不对,找左孩子,如果没找到,那么node为空指针,则找右兄弟,即前序遍历

树与对应二叉树的遍历

void tral(tree t ,int m)
{
if(t)
{
cout<data<<endl;
for(int i=0;i<m;i++)
tral(t->child[i],m) //m为孩子的个数
}
}

树的遍历方案

树没有中序遍历,因为没有中的概念。前序就是先访问树根,再孩子;后序是先孩子,再根

注意下图M的位置标错了,应该是J的孩子而不是I的孩子

递归后序到F时,由于同样要后序,所以就先KL,最后在F,F完了再G

层序遍历树

森林遍历

前缀树

决策树

ID3算法

二叉搜索树插入

包装了一下

//插入一个节点,树为空,插入节点即为根节点,否则找合适的位置插入
void InsertNode(BiTree &tree, BiTree &s)		//注意:使用引用传递
{if (tree == NULL)tree = s;elseSearchTreeNode(tree, s);
}
//二叉排序树创建,每次增加一个结点,插到现有的二叉树上去
void CreateOrderBinaryTree(BiTree &tree, int *a)
{for (int i = 0; i < len; i++){BiTree s = (BiTree)malloc(sizeof(BiTNode));s->data = a[i];s->lchild = NULL;s->rchild = NULL;InsertNode(tree, s);}
}

 

typedef struct BiTNode
{ElemType data;struct BiTNode *lchild, *rchild;
} *BiTree;typedef struct Node
{BiTree btnode;bool isfirst;
}*node;

非递归遍历 

//非递归前序遍历
void ProOrder(BiTree pRoot)
{if (pRoot == NULL)return;BiTree p = pRoot;stack<BiTree>s;while (p != NULL || !s.empty()){while (p != NULL){s.push(p);cout << p->data << " ";		//第一次遇见的时候输出p = p->lchild;}if (!s.empty()){p = s.top();s.pop();p = p->rchild;}}
}
//非递归中序遍历
void midOrder(BiTree pRoot)
{if (pRoot == NULL)return;BiTree p = pRoot;stack<BiTree>s;while (p != NULL || !s.empty()){while (p!=NULL){s.push(p);p = p->lchild;}if (!s.empty()){p = s.top();cout << p->data << " ";		//第二次遇见的时候输出s.pop();p = p->rchild;}}
}

 

//非递归实现后续遍历
void postOrder(BiTree pRoot)
{if (pRoot == NULL)return;stack<node>s;BiTree p = pRoot;node tmp;while (p!=NULL || !s.empty()){while (p != NULL)		//沿左子树一直往下搜索,直至出现没有左子树的结点{node btn = (node)malloc(sizeof(Node));btn->btnode = p;btn->isfirst = true;s.push(btn);p = p->lchild;}if (!s.empty()){tmp = s.top();s.pop();if (tmp->isfirst == true)			//第一次出现在栈顶{tmp->isfirst = false;s.push(tmp);p = tmp->btnode->rchild;}else						//第二次出现在栈顶{cout << tmp->btnode->data<<" ";p = NULL;}}}
}//非递归实现后续遍历
void postorder(BiTree pRoot)
{if (pRoot == NULL)return;stack<BiTree>s;BiTree cur = pRoot, pre = NULL;s.push(pRoot);while (!s.empty()){cur = s.top();if ((cur->lchild == NULL&&cur->rchild == NULL) ||((pre == cur->lchild || pre == cur->rchild) && pre != NULL)){cout << cur->data << " ";s.pop();pre = cur;}else{if (cur->rchild != NULL)s.push(cur->rchild);if (cur->lchild != NULL)s.push(cur->lchild);}}
}

 

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

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

相关文章

计算机网络期末复习-Part1

1、列举几种接入网技术&#xff1a;ADSL&#xff0c;HFC&#xff0c;FTTH&#xff0c;LAN&#xff0c;WLAN ADSL&#xff08;Asymmetric Digital Subscriber Line&#xff09;&#xff1a;非对称数字用户线路。ADSL 是一种用于通过电话线连接到互联网的技术&#xff0c;它提供…

RabbitMQ集群

RabbitMQ概述 1.RabbiMQ简介 RabbiMQ是⽤Erang开发的&#xff0c;集群⾮常⽅便&#xff0c;因为Erlang天⽣就是⼀⻔分布式语⾔&#xff0c;但其本身并不⽀持负载均衡。支持高并发&#xff0c;支持可扩展。支持AJAX&#xff0c;持久化&#xff0c;用于在分布式系统中存储转发消…

excel中超级表和普通表的相互转换

1、普通表转换为超级表 选中表内任一单元格&#xff0c;然后按CtrlT&#xff0c;确认即可。 2、超级表转换为普通表 选中超级表内任一单元格&#xff0c;右键&#xff0c;表格&#xff0c;转换为区域&#xff0c;确定即可。 这时虽然已经变成了普通表&#xff0c;但样式没有…

vue3怎么获取el-form的元素节点

在元素中使用ref设置名称 在ts中通过从element-plus引入formInstance,设置formRef同名名称字段来获取el-form节点

flutter笔记:骨架化加载器

flutter笔记 骨架化加载器 - 文章信息 - Author: Jack Lee (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/134224135 【介绍】&#xff1a;本文介…

OpenCV 输出文本

PutText() 输出文本 OpenCV5 将支持中文字符的输出, 当前版本OpenCV4原生不支持, 可以使用Contrib包FreeType方式实现, 不过比较麻烦.为了省事, 也可以通过将Mat转成bitmap,然后使用GDI方式输出中文字符. 示例代码 /// <summary>/// OpenCV暂时不能支持中文字符输出,显示…

Qt 继承QAbstractListModel实现自定义ListModel

1.简介 QAbstractListModel是Qt框架中的一个抽象类&#xff0c;用于实现数据模型&#xff0c;用于在Qt的视图组件中展示和编辑列表数据。与QAbstractTableModel类似&#xff0c;它也是一个抽象类&#xff0c;提供了一些基本的接口和默认实现&#xff0c;可以方便地创建自定义的…

C++入门学习(4)引用 (讲解拿指针比较)

上期回顾 在学习完函数重载之后&#xff0c;我们可以使用多个重名函数进行操作&#xff0c;会发现C真的是弥补了好多C语言的不足之处&#xff0c;真的不禁感概一下&#xff0c;时代的进步是需要人去做出改变的&#xff0c;而不是一味的使用啊&#xff01;所以我们今天继续学一下…

浅析三维模型重建的地面控制点精度常见的几个问题及解决方法

浅析三维模型重建的地面控制点精度常见的几个问题及解决方法 在倾斜摄影三维模型重建过程中&#xff0c;地面控制点的精度是影响模型几何精度的关键因素之一。以下是常见的问题及相应的解决方法&#xff1a; 1、问题&#xff1a;地面控制点坐标测量误差较大。 解决方法&#…

《golang设计模式》第三部分·行为型模式-05-仲裁者/中介模式(Mediator)

文章目录 1. 概述1.1 作用1.2 角色1.3 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 仲裁者&#xff08;Mediator&#xff09;可以封装和协调多个对象之间的耦合交互行为&#xff0c;以减弱这些对象之间的耦合关联。 1.1 作用 将多个对象相互耦合的设计转变为所有对象…

【OpenCV实现图像:图像处理技巧之空间滤波】

文章目录 概要导入库空间过滤器模板展示效果分析与总结 概要 空间滤波器是数字图像处理中的基本工具之一。它通过在图像的每个像素位置上应用一个特定的滤波模板&#xff0c;根据该位置周围的相邻像素值进行加权操作&#xff0c;从而修改该像素的值。这种加权操作能够突出或模…

非线性【SVM】的创建和使用

先来绘制散点图&#xff1a; from sklearn.datasets import make_circles X,y make_circles(100, factor0.1, noise.1) # 100个样本&#xff0c;factor:内圈和外圈的距离之比&#xff0c;noise:噪声 X.shape y.shape plt.scatter(X[:,0],X[:,1],cy,s50,cmap"rainbow&qu…

数据库SQL

数据库&SQL 数据库基本概念数据库DataBase定义 数据库管理系统(DBMS)定义在JAVA项目中与数据库的结合数据库管理系统中常见的概念库与表的关系 SQL数据类型数字类型浮点类型字符类型TEXT类型日期类型 SQL语言的分类DDL:数据定义语言修改表结构的注意事项 DML:数据操作语言D…

uni-app:js实现数组中的相关处理-数组复制

一、slice方法-浅拷贝 使用分析 创建一个原数组的浅拷贝&#xff0c;对新数组的修改不会影响到原数组slice() 方法创建了一个原数组的浅拷贝&#xff0c;这意味着新数组和原数组中的对象引用是相同的。因此&#xff0c;当你修改新数组中的对象时&#xff0c;原数组中相应位置的…

PDF Expert for mac(苹果电脑专业pdf编辑器)兼容12系统

PDF Expert是macOS平台上的一款优秀的PDF阅读和编辑工具&#xff0c;由Readdle公司开发。它不仅拥有方便、易用的界面&#xff0c;还具备诸多功能&#xff0c;比如编辑PDF文件、添加批注、填写表格、签署文件、合并文档等。安装:PDF Expert for Mac(PDF编辑阅读转换器)v3.5.2中…

HT6819 3.3W 防削顶低EMI立体声 D类音频功率放大器

HT6819的防削顶失真功能可检测并抑Z由于音乐、语Y信号幅度过大或电池电压下降所引起的输出削顶失真&#xff08;破音&#xff09;&#xff0c;显著提高音质&#xff0c;创造舒适的听音享受&#xff0c;并保护扬声器免受过载损坏。通过在ACRC端外接不同电阻电容值,可灵活设置放大…

C++引用和指针的区别

C引用和指针的区别 引用是一种更加安全的指针 1、引用必须初始化&#xff0c;指针可以不初始化&#xff1b; 2、由下图可以看出&#xff0c;定义一个指针和引用在汇编阶段是一模一样的&#xff1b; 通过引用变量修改所引用的内存的值和通过指针解引用修改指针指向内存的值&…

CAS200 CLS216 基于图形用户界面的快速应用程序开发

CAS200 CLS216 基于图形用户界面的快速应用程序开发 最新的Sapera Vision软件套件包括萨佩拉加工和新的星形胶质细胞铥人工智能(AI)的图形应用。该软件套件提供经过现场验证的图像处理和人工智能功能&#xff0c;用于设计、开发和部署高性能机器视觉应用。 这个最新版本的Sape…

chrome driver下载、selenium安装及报错解决

目录 一、Chrome驱动下载 1.查看Chrome版本 2.下载驱动 3.驱动的路径 无法运行驱动 二、selenium的安装与使用 1.安装selenium 2.使用selenium 参考 一、Chrome驱动下载 1.查看Chrome版本 打开Chrome浏览器&#xff0c;点击右上角的三个点&#xff0c;再点击设置。 …

07-MySQL-进阶-锁InnoDB引擎MySQL管理

涉及资料 链接&#xff1a;https://pan.baidu.com/s/1M1oXN_pH3RGADx90ZFbfLQ?pwdCoke 提取码&#xff1a;Coke 一、锁 ①&#xff1a;概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xf…