数据结构——第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.hqwc.cn/news/572859.html

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

相关文章

华为开源自研AI框架昇思MindSpore应用案例:梯度累加

目录 一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例 二、案例实现 梯度累加的训练算法&#xff0c;目的是为了解决由于内存不足&#xff0c;导致Batch size过大神经网络无法训练&#xff0c;或者网络模型过大无法加载的OOM&#xff08;Out Of Memory&#xff…

软考 - 软件架构设计师 - 关系模型的完整性规则

前言 关系模型的完整性规则是一组用于确保关系数据库中数据的完整性和一致性的规则。这些规则定义了在关系数据库中如何存储、更新和查询数据&#xff0c;以保证数据的准确性和一致性。 详情 关系模型的完整性规则主要包括以下三类&#xff1a; 实体完整性规则 这是确保每个…

自动化与智能化并行:数字化运维体系助力企业腾飞

文章目录 文章目录 文章目录 一、引言二、数字化运维体系的核心要素三、构建数字化运维体系的策略四、数字化运维体系的实施与挑战主要内容读者对象 一、引言 随着信息技术的迅猛发展&#xff0c;数字化转型已成为企业提升竞争力、实现可持续发展的必由之路。在数字化转型的过…

nvm安装以后,node -v npm 等命令提示不是内部或外部命令

因为有vue2和vue3项目多种&#xff0c;所以为了适应各类版本node,使用nvm管理多种node版本&#xff0c;但是当我按教程安装nvm以后&#xff0c;nvm安装以后&#xff0c;node -v npm 等命令提示不是内部或外部命令 首先nvm官网网址&#xff1a;https://github.com/coreybutler/…

鸿蒙HarmonyOS应用开发之使用Node-API实现跨语言交互开发流程

使用Node-API实现跨语言交互&#xff0c;首先需要按照Node-API的机制实现模块的注册和加载等相关动作。 ArkTS/JS侧&#xff1a;实现C方法的调用。代码比较简单&#xff0c;import一个对应的so库后&#xff0c;即可调用C方法。 Native侧&#xff1a;.cpp文件&#xff0c;实现模…

LeetCode刷题---游戏玩法分析 IV

1.首先查询出每个用户首次登录的第二天&#xff0c;并将其创建为临时表&#xff0c;命名为Expected (select player_id,Date_add(min(event_date),Interval 1 day) as second_date from activity group by player_id) as Expected这里使用了函数DATE_ADD&#xff0c;详细用法可…

GEE:将分类特征和标签提取到样本点,并以(csv/shp格式)下载到本地

作者:CSDN @ _养乐多_ 本文将介绍在Google Earth Engine(GEE)平台上,下载用于机器学习分类或者回归的样本点数据,样本点数据携带了分类特征和标签信息,可以以csv格式或者SHP格式。 结果如下图所示, 文章目录 一、核心函数1.1 采样1.2 下载函数二、代码链接三、完整代码…

【前端学习——css篇】1.css的盒模型

https://github.com/febobo/web-interview 1.css的盒模型 html中的所有元素都是一个盒子&#xff0c;组成包括&#xff1a;内容content、内边距padding、边框border、外边距margin content&#xff0c;即实际内容&#xff0c;显示文本和图像 boreder&#xff0c;即边框&#…

【Web APIs】正则表达式

目录 1.正则表达式 2.正则表达式语法 3.元字符 3.1边界符 3.2量词 3.3字符类 4.修饰符 1.正则表达式 正则表达式&#xff08;Regular Expression&#xff09;是用于匹配字符串中字符组合的模式&#xff0c;在 JavaScript中&#xff0c;正则表达式也是对象。通常用来查…

07_Response

文章目录 案例&#xff08;请求分发案例&#xff09; Response响应行响应头响应体特殊响应头refreshContent-typeContent-dispositionlocation 案例&#xff08;登录案例&#xff09; 案例&#xff08;请求分发案例&#xff09; 场景&#xff1a;有多个请求 Http://localhost:…

【React】vite + react 项目,进行配置 eslint

安装与配置 eslint 1 安装 eslint babel/eslint-parser2 初始化配置 eslint3 安装 vite-plugin-eslint4 配置 vite.config.js 文件5 修改 eslint 默认配置 1 安装 eslint babel/eslint-parser npm i -D eslint babel/eslint-parser2 初始化配置 eslint npx eslint --init相关…

经典应用丨光伏行业扫码追溯新标杆,海康机器人AI智能读码器!

去年&#xff0c;光伏发电行业持续高速发展&#xff0c;我国仅在前九个月累计装机521.08GW&#xff0c;同比增长达到45.3%&#xff0c;已成为第二大电源类型超过水电。根据《2023中国与全球光伏发展白皮书》预测&#xff0c;到2030年&#xff0c;中国能够实现国家规划的风电和光…