数据结构——第5章 树和二叉树


1 二叉树

二叉树和树都属于树形结构,但两者互不包含。即二叉树不是特殊的树。

1.1 二叉树的基本概念

1.2 二叉树的顺序存储

仅适用于完全二叉树

#define MaxSize 100
typedef int ElemType; 
typedef struct TreeNode{ElemType value;//结点中的数据元素bool isEmpty;//结点是否为空 
}TreeNode;

构造结点数为MaxSize的完全二叉树t。 

TreeNode t[MaxSize];

1.3 二叉树的链式存储

1.3.1 二叉链表

typedef struct BiNode{ElemType data;//数据域 struct BiNode *lchild,*rchild;//左右孩子指针  
}BiNode,*BiTree; 

二叉链表具体实现:

#include<iostream>
#include<stack> 
#include<queue>
using namespace std;
typedef char ElemType; 
//二叉树的结点(链式存储)
typedef struct BiNode{ElemType data;//数据域 struct BiNode *lchild,*rchild;//左右孩子指针 
//	struct BiTNode *parent;//父节点指针  三叉链表 
}BiNode,*BiTree; 
//先序遍历的顺序建立二叉链表
void CreateBiTree(BiTree &T){char ch;cin>>ch;if(ch=='#') T=NULL;else{T=new BiNode;T->data=ch; CreateBiTree(T->lchild);CreateBiTree(T->rchild);}
} 
//先序遍历
void PreOrder(BiTree T){if(T!=NULL){cout<<T->data<<" ";PreOrder(T->lchild);PreOrder(T->rchild);}
} 
//中序遍历
void InOrder(BiTree T){if(T!=NULL){PreOrder(T->lchild);cout<<T->data<<" ";PreOrder(T->rchild);}
}
//后序遍历
void AfterOrder(BiTree T){if(T!=NULL){PreOrder(T->lchild);PreOrder(T->rchild);cout<<T->data<<" ";}
}
//非递归调用的先序遍历
void  PreOrderTree(BiTree T){stack<BiNode *> s;while(T||!s.empty()){while(T){cout<<T->data;s.push(T);T=T->lchild;}if(!s.empty()){T=s.top();s.pop();T=T->rchild;}}cout<<endl;
}
//非递归调用的中序遍历
void  InOrderTree(BiTree T){stack<BiNode *> s;while(T||!s.empty()){while(T){s.push(T);T=T->lchild;}if(!s.empty()){T=s.top();s.pop();cout<<T->data;T=T->rchild;}}cout<<endl;
}//非递归调用的后序遍历
void AfterOrderTree(BiTree T){stack<BiNode*> s;BiNode* lastVisited = NULL; // 记录上一个访问过的结点while (T || !s.empty()) {while (T) {s.push(T);T = T->lchild;}if (!s.empty()) {BiNode* topNode = s.top();if (topNode->rchild && topNode->rchild != lastVisited) {T = topNode->rchild;} else {cout << topNode->data;lastVisited = topNode;	s.pop();}}}cout << endl;
}
//层次遍历
void LevelOrder(BiTree T){queue<BiNode *> q;q.push(T);while(q.size()){BiNode *f=q.front();q.pop();cout<<f->data;if(f->lchild!=NULL){q.push(f->lchild);}if(f->rchild!=NULL){q.push(f->rchild);}}cout<<endl; 
} 
//复制二叉树
void Copy(BiTree T,BiTree &NewT){if(T==NULL){NewT=NULL;return;}else{NewT=new BiNode;NewT->data=T->data;Copy(T->lchild,NewT->lchild);Copy(T->rchild,NewT->rchild);}
} 
//计算二叉树的深度
int Depth(BiTree T){if(T==NULL){return 0;}int m=Depth(T->lchild);int n=Depth(T->rchild);if(m>n){return m+1;}else{return n+1;}
} 
//统计二叉树中结点的个数
int NodeCount(BiTree T){if(T==NULL) return 0;else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
} 
int main(){BiTree T;cout<<"------------------创建二叉链表(先序遍历的顺序)------------------"<<endl;CreateBiTree(T);cout<<"创建完成:";PreOrder(T);//先序遍历的顺序输出二叉树cout<<endl;cout<<"------------------先序遍历输出二叉树------------------"<<endl;PreOrderTree(T);cout<<"------------------中序遍历输出二叉树------------------"<<endl;InOrderTree(T);cout<<"------------------后序遍历输出二叉树------------------"<<endl;AfterOrderTree(T);cout<<"------------------层次遍历输出二叉树------------------"<<endl;LevelOrder(T);cout<<"------------------求深度------------------"<<endl;cout<<"深度为:"<<Depth(T)<<endl; cout<<"------------------求结点个数------------------"<<endl;cout<<"结点个数为:"<<NodeCount(T)<<endl;return 0; 
} 

求中序遍历的前驱和后继:

//找前驱
BiNode *p;//目标结点 
BiNode *pre;
BiNode *final;
void visit(BiNode *q){if(q==p){final=pre;}else{pre=q;}
//	//找后继
//	if(pre==p){
//		final=q;
//	}else{
//		pre=q;
//	}
}
void findPre(BiTree T){if(T!=NULL){T=T->lchild;visit(T);T=T->rchild;}
} 

1.3.2 线索链表

定义

typedef char ElemType;
typedef struct BiThrNode{ElemType data;struct BiThrNode *lchild,*rchild;int LTag,RTag;//左右标志,0:指向左右孩子 1:指向前驱或后继 
}BiThrNode,* BiThrTree; 

先序线索化

//先序线索化(防止转圈问题)
void PreThreadTree(BiThrNode *p,BiThrNode *pre){if(p!=NULL){//根 if(p->lchild==NULL){p->LTag=1;p->lchild=pre;}else{p->LTag=0;}if(pre!=NULL&&pre->rchild==NULL){pre->RTag=0;pre->rchild=p;}else{p->RTag=0;}pre=p;//左if(p->LTag==0) PreThreadTree(p->lchild,pre);//右 PreThreadTree(p->rchild,pre);}
} 
void CreatePreThreadTree(BiThrTree T){BiThrNode *pre=NULL;if(T!=NULL){InThreadTree(T,pre);if(pre->rchild==NULL){pre->RTag=1;}}
}

中序线索化

//中序线索化
void InThreadTree(BiThrNode *p,BiThrNode *pre){if(p!=NULL){InThreadTree(p->lchild,pre);if(p->lchild==NULL){p->LTag=1;p->lchild=pre;}else{p->LTag=0;}if(pre!=NULL&&pre->rchild==NULL){pre->RTag=0;pre->rchild=p;}else{p->RTag=0;}pre=p;InThreadTree(p->rchild,pre);}
} 
void CreateInThreadTree(BiThrTree T){BiThrNode *pre=NULL;if(T!=NULL){InThreadTree(T,pre);if(pre->rchild==NULL){pre->RTag=1;}}
}

 后序线索化

//后序线索化
void PostThreadTree(BiThrTree p,BiThrNode *pre){if(p!=NULL){//左PostThreadTree(p->lchild,pre);//右 PostThreadTree(p->rchild,pre);//根 if(p->lchild==NULL){p->LTag=1;p->lchild=pre;}else{p->LTag=0;}if(pre!=NULL&&pre->rchild==NULL){pre->RTag=0;pre->rchild=p;}else{p->RTag=0;}pre=p;}
} 
void CreatePostThreadTree(BiThrTree T){BiThrNode *pre=NULL;if(T!=NULL){InThreadTree(T,pre);if(pre->rchild==NULL){pre->RTag=1;}}
} 

1.3.3 三叉链表

typedef struct BiNode{ElemType data;//数据域 struct BiNode *lchild,*rchild;//左右孩子指针 struct BiTNode *parent;//父节点指针
}BiNode,*BiTree;

2 树

1.1 树的基本概念

树(Tree)是n(n>=0)个结点的有限集,它或为空树(n=0);或为非空树。

基本术语

结点:树中的一个独立单元

1.2 树的

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

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

相关文章

手机有线投屏到直播姬pc端教程

1 打开哔哩哔哩直播姬客户端并登录(按下图进行操作) 2 手机用usb数据线连接电脑(若跳出安装驱动的弹窗点击确定或允许),usb的连接方式为仅充电(手机差异要求为仅充电),不同品牌手机要求可能不一样,根据实际的来 3 在投屏过程中不要更改usb的连接方式(不然电脑会死机需要重启) …

微服务(基础篇-007-RabbitMQ部署指南)

目录 05-RabbitMQ快速入门--介绍和安装_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p65&vd_source60a35a11f813c6dff0b76089e5e138cc 1.单机部署 1.1.下载镜像 1.2.安装MQ 2.集群部署 2.1.集群分类 2.2.设置网络 视频地址&#xff1a; 05-Rab…

LeetCode刷题记(一):1~30题

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以…

蓝桥杯第793题——排水系统

题目描述 对于一个城市来说&#xff0c;排水系统是极其重要的一个部分。 有一天&#xff0c;小 C 拿到了某座城市排水系统的设计图。排水系统由 n 个排水结点&#xff08;它们从 1∼n 编号&#xff09;和若干个单向排水管道构成。每一个排水结点有若干个管道用于汇集其他排水…

读取信息boot.bin和xclbin命令

bootgen读Boot.bin命令 johnjohn-virtual-machine:~/project_zynq/kv260_image_ubuntu22.04$ bootgen -read BOOT-k26-starter-kit-202305_2022.2.bin xclbinutil读xclbin命令 johnjohn-virtual-machine:~/project_zynq/kv260_image_ubuntu22.04$ xclbinutil -i kv260-smartca…

整型之韵,数之舞:大小端与浮点数的内存之旅

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱’博客 所属栏目&#xff1a;人工智能 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 1.0 整形提升 我们先来看看代码。 int main() {char a 3;char b 127;char …

篮球竞赛预约平台的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

【PowerDesigner】PGSQL反向工程过程已中断

问题 反向工程过程已中断,原因是某些字符无法通过ANSI–&#xff1e;UTF-16转换进行映射。pg导入sql时报错&#xff0c;一查询是power designer 反向工程过程已中断&#xff0c;某些字符无法通过ANSI–>UTF-16转换进行映射&#xff08;会导致数据丢失&#xff09; 处理 注…

【LeetCode】热题100 刷题笔记

文章目录 T1 两数之和T49 字母异位词分组常用小技巧 T1 两数之和 链接&#xff1a;1. 两数之和 题目&#xff1a; 【刷题感悟】这道题用两层for循环也能做出来&#xff0c;但我们还是要挑战一下时间复杂度小于 O ( n 2 ) O(n^2) O(n2)的解法&#xff0c;不能因为它是第一道 …

docker部署实用的运维开发手册

下载镜像 docker pull registry.cn-beijing.aliyuncs.com/wuxingge123/reference:latestdocker-compose部署 vim docker-compose.yml version: 3 services:reference:container_name: referenceimage: registry.cn-beijing.aliyuncs.com/wuxingge123/reference:latestports:…

u盘插在电脑上显示要格式化磁盘怎么办

咨询&#xff1a;“U盘插入电脑&#xff0c;提示需要先格式化 才可使用。对于此种情况&#xff0c;在不需要格式化的情况下&#xff0c;是否可以恢复U盘内容&#xff1f;谢谢” 当我们尝试将U盘插入电脑时&#xff0c;有时会遇到一个令人困惑的提示&#xff1a;电脑要求我们格式…

【总结】在嵌入式设备上可以离线运行的LLM--Llama

文章目录 Llama 简介运用另一种&#xff1a;MLC-LLM 一个令人沮丧的结论在资源受限的嵌入式设备上无法运行LLM&#xff08;大语言模型&#xff09;。 一丝曙光&#xff1a;tinyLlama-1.1b&#xff08;10亿参数&#xff0c;需要至少2.98GB的RAM&#xff09; Llama 简介 LLaMA…

数据处理库Pandas数据结构DataFrame

Dataframe是一种二维数据结构&#xff0c;数据以表格形式&#xff08;与Excel类似&#xff09;存储&#xff0c;有对应的行和列&#xff0c;如图3-3所示。它的每列可以是不同的值类型&#xff08;不像 ndarray 只能有一个 dtype&#xff09;。基本上可以把 DataFrame 看成是共享…

KIMI官方精选提示词,好牛的感觉啊啊啊!

晚上好&#xff0c;我是云桃桃。一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃 1枚程序媛&#xff0c;大专生&#xff0c;2年时间从1800到月入过万&#xff0c;工作5年买房。 分享成长心得。 255篇原创内容-公众号 后台回复“前端工具”可获取开发工具&#xff0…

vscode安装

&#x1f308;个人主页&#xff1a;Rookie Maker &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于IT的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x1f601; 喜欢的小伙伴记得一键三连哦 ૮(˶ᵔ ᵕ ᵔ˶)ა …

Qt+OpenGL入门教程(三)——绘制三角形

通过前两篇文章的学习&#xff0c;我想大家应该有了基本的理解&#xff0c;我们接下来实操一下。 创建Qt OpenGL窗口 QOpenGLWidget QGLWidget是传统QtOpenGL模块的一部分&#xff0c;与其他QGL类一样&#xff0c;应该在新的应用程序中避免使用。相反&#xff0c;从Qt5.4开始…

YOLOv8结合SCI低光照图像增强算法!让夜晚目标无处遁形!【含端到端推理脚本】

这里的"SCI"代表的并不是论文等级,而是论文采用的方法 — “自校准光照学习” ~ 左侧为SCI模型增强后图片的检测效果,右侧为原始v8n检测效果 这篇文章的主要内容是通过使用SCI模型和YOLOv8进行算法联调,最终实现了如上所示的效果:在增强图像可见度的同时,对图像…

亿图图示如何绘制WBS分解?

什么是WBS分解&#xff1f; Wbs分解俗称工作分解结构法&#xff0c;就是把一个大项目按照原则分成多个小任务&#xff0c;再把每项小任务分解成具体的工作&#xff0c;然后把工作分到每人的工作中的一种分解方法。 如下图这里以开店KTV为例&#xff0c;项目是开店&#xff0c;小…

【QT入门】 QListWidget各种常见用法详解之列表模式

往期回顾 【QT入门】 Qt代码创建布局之setLayout使用-CSDN博客 【QT入门】 Qt代码创建布局之多重布局变换与布局删除技巧-CSDN博客 【QT入门】 QTabWidget各种常见用法详解-CSDN博客 【QT入门】 QListWidget各种常见用法详解之列表模式 QListWidget有列表和图标两种显示模式&a…

C++bitset类型

bitset类型 我们介绍了将整型运算对象当作二进制位集合处理的一些内置运算符。 标准库还定义了bitset类&#xff0c;使得位运算的使用更为容易&#xff0c;并且能够处理超过最长整型类型大小的位集合。bitset类定义在头文件bitset中。 定义和初始化bitset bitset类是一个类模…