树是一种对现实中一些问题的抽象结构,是实现高效算法的基础,一般是使用结构体数组或者三个数组来存储。树的一些属性:根、结点、子结点、兄弟结点、深度、度、树高等

树的度:树中所有节点的度的最大值
节点:包含一个数据元素及若干指向子树分支的信息
节点的度:一个节点拥有子树的数目
叶子节点:没有子树的节点或者度为零的节点(终端节点)
分支节点:度不为零的节点(非终端节点)
树的深度:树中所有节点的层次最大值称为树的深度(或叫树的高度)

如何存储树,一般使用的是“左子右兄弟表示法”(left-child right-sibling representation)LCRS,来表示树,左子右兄弟表示法中各个结点具有以下信息:

结点u的父结点
结点u最左侧的子结点
结点u右侧紧邻的兄弟结点

实现,一般是结构体数组或者三个数组来存储

struct Node {int parent,left,right};
Node T[MAX];

或者

int parent[MAX],left[MAX],right[MAX];

#include<stdio.h>
#include<iostream>
#include<algorithm>using namespace std;
//定义根节点的父节点为-1
#define NIL -1
#define MAX 10000
//定义结构体数组,父节点、左子节点、右兄弟节点
struct Node
{int p,l,r;
};
Node T[MAX];
int n,D[MAX];//节点的深度void myPrint(int u)
{cout<<"节点"<<u<<":";cout<<"父节点="<<T[u].p<<",";cout<<"深度="<<D[u]<<",";//节点类型if(T[u].p==NIL){cout<<"[根节点],";}else if(T[u].l==NIL){cout<<"[叶子节点],";}else{cout<<"[内部节点],";}int i,c;cout<<"子节点:";//遍历当前左子节点不存在右兄弟节点为止for(i=0,c=T[u].l;c!=NIL;i++,c=T[c].r){if(i)cout<<",";cout<<c;}cout<<endl;
}
//递归求深度
void rec(int u,int p){
D[u]=p;
if(T[u].r!=NIL){rec(T[u].r,p);}//右兄弟节点深度相同
if(T[u].l!=NIL){rec(T[u].l,p+1);}//最左侧子节点的深度为自己的深度+1
}int main()
{int i,j,d,v,c,l,r;cout<<"输入节点个数:";cin>>n;for(i=0;i<n;i++){T[i].p=T[i].l=T[i].r=NIL;}//初始化父节点、左子节点、右兄弟节点为NILfor(i=0;i<n;i++){//节点个数cin>>v>>d;//编号和度for(j=0;j<d;j++){cin>>c;//输入每个子节点的值if(j==0){T[v].l=c;}else{T[l].r=c;}l=c;T[c].p=v;}}for(i=0;i<n;i++){if(T[i].p==NIL)r=i;}rec(r,0);//递归到根节点(深度为0)为止for(i=0;i<n;i++){myPrint(i);}cout<<"节点4的父节点、左子节点、右兄弟节点分别为:"<<T[4].p<<"、"<<T[4].l<<"、"<<T[4].r;return 0;
}

看一个有根二叉树的示例,二叉树是一种很重要的数据结构,二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。

二叉树的五种基本形态:
1、空二叉树
2、只有一个根结点的二叉树
3、只有左子树
4、只有右子树
5、完全二叉树

二叉树的性质:
性质1:二叉树的第i层上至多有2i-1(i≥1)个节点
性质2:深度为h的二叉树中至多含有2h-1个节点
性质3:若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1
性质4:具有n个节点的完全二叉树深为log2x+1(其中x表示不大于n的最大整数)
性质5:若对一棵有n个节点的完全二叉树进行顺序编号(1≤i≤n),那么,对于编号为i(i≥1)的节点: 当i=1时,该节点为根,它无双亲节点 。 当i>1时,该节点的双亲节点的编号为i/2 。 若2i≤n,则有编号为2i的左节点,否则没有左节点 。 若2i+1≤n,则有编号为2i+1的右节点,否则没有右节点。

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
//定义根结点的父结点为-1
#define NIL -1
#define MAX 10000
//定义结构体数组,父结点、左子结点、右子结点
struct Node{int p,l,r;};
Node T[MAX];
int n,D[MAX],H[MAX];//结点的深度与高度
//递归求深度
void getDepth(int u,int p){
if(u==NIL)return;
D[u]=p;
getDepth(T[u].l,p+1);
getDepth(T[u].r,p+1);
}
//递归求高度(最后求出左子结点和右子结点高度的最大值)
int getHeight(int u){
int h1=0,h2=0;
if(T[u].l!=NIL){h1=getHeight(T[u].l)+1;}
if(T[u].r!=NIL){h2=getHeight(T[u].r)+1;}
return H[u]=h1>h2?h1:h2;
}
//返回兄弟结点
int getSibling(int u){
if(T[u].p==NIL)return NIL;//必须要有父结点,才有兄弟结点
if(T[T[u].p].l!=u&&T[T[u].p].l!=NIL){return T[T[u].p].l;}//父结点的左子结点不是本结点且存在,就是本结点的兄弟结点
if(T[T[u].p].r!=u&&T[T[u].p].r!=NIL){return T[T[u].p].r;}
}void myPrint(int u)
{cout<<"结点"<<u<<":";cout<<"父结点="<<T[u].p<<",";cout<<"兄弟结点="<<getSibling(u)<<",";int deg=0;//度if(T[u].l!=NIL){deg++;}if(T[u].r!=NIL){deg++;}cout<<"度="<<deg<<",";cout<<"深度="<<D[u]<<",";cout<<"高度="<<H[u]<<",";//结点类型if(T[u].p==NIL){cout<<"[根结点]";}else if(T[u].l==NIL&&T[u].r==NIL){cout<<"[叶子结点]";}else{cout<<"[内部结点]";}cout<<endl;
}int main()
{int v,l,r,root=0;//编号、左子结点、右子结点、根结点scanf("%d",&n);for(int i=0;i<n;i++){T[i].p=NIL;}for(int i=0;i<n;i++){scanf("%d %d %d",&v,&l,&r);T[v].l=l;T[v].r=r;if(l!=NIL){T[l].p=v;}if(r!=NIL){T[r].p=v;}}for(int i=0;i<n;i++){if(T[i].p==NIL){root=i;}}getDepth(root,0);getHeight(root);for(int i=0;i<n;i++){myPrint(i);}return 0;
}

二叉树的遍历和重建https://blog.csdn.net/weixin_41896770/article/details/114006381

树结构的储存与特点(相关基础知识)相关推荐

  1. 黑马程序员_JAVA相关基础知识

    ------- android培训.java培训.期待与您交流! -------- JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便 ...

  2. 【生信】基因组学相关基础知识2

    [生信]基因组学相关基础知识2 本文图片来源网络或学术论文,文字部分来源网络与学术论文,仅供学习使用. 目录 [生信]基因组学相关基础知识2 9.细胞增殖与分化的定义和区别 10.有丝分裂与减数分裂 ...

  3. 【RAC】RAC相关基础知识

    [RAC]RAC相关基础知识 1.CRS简介    从Oracle 10G开始,oracle引进一套完整的集群管理解决方案--Cluster-Ready Services,它包括集群连通性.消息和锁. ...

  4. 零件三维缺陷检测相关基础知识

    零件三维缺陷检测相关基础知识 看了几篇文献,总结下来三维缺陷检测的过程,总的来说分为: 零件表面的三维数据获取 根据零件的三维数据信息进行三维重建 目标点云与标准点云的配准 配准后的点云做差得到缺陷信 ...

  5. 6-DoF问题相关基础知识笔记

    6-DoF问题相关基础知识笔记 一.什么是6-DoF,即6个自由度是什么? 二.PnP算法 三.BOP挑战与官方数据集简介 BOP数据集 BOP toolkit BOP挑战的介绍页面 四.相关论文 C ...

  6. 【C++后台开发面经】面试总结第三波:针对后台开发相关基础知识分类总结

    前言 面试总结第三波,关于后台开发面试相关基础知识,数据结构.算法.linux操作系统.计算机网络.C++.数据库进行分类总结. 后端面试总结 目录 后端面试总结 1.数据结构 链表和数组的区别 树的 ...

  7. mysql bdb版本_深入理解mysql之BDB系列(1)---BDB相关基础知识

    深入理解mysql之BDB系列(1) ---BDB相关基础知识 作者:杨万富 一:BDB体系结构 1.1.BDB体系结构 BDB总体的体系结构如图1.1所看到的,包括五个子系统(见图1.1中相关数). ...

  8. 深入理解mysql之BDB系列(1)---BDB相关基础知识

        深入理解mysql之BDB系列(1) ---BDB相关基础知识 作者:杨万富 一:BDB体系结构 1.1.BDB体系结构 BDB整体的体系结构如图1.1所示,包含五个子系统(见图1.1中相关数 ...

  9. 新手小白必须了解的数据相关基础知识(一)

    不管是做数据标注还是数据清洗.分析等等,大家是不是遇到过如下问题? 提示文件没有软件能打开. 用常用软件打开后乱码. 等等问题,特别是刚接触数据行业的小伙伴,有很多没有计算机背景知识,完全摸不到头脑到 ...

  10. 多核程序设计的相关基础知识----以误差扩散算法为例

        本文从基础入手,主要阐述基于桌面电脑的多核程序设计的基础知识,包括一些向量化运算,虚拟机算,多线程等的相关知识总结. 一.计算平台的分类 单指令单数据流机器(SISD) 传统的串行计算机,所有 ...

最新文章

  1. Java字符串就该这样设计
  2. 赋能 打造应对不确定性的敏捷团队 pdf_《赋能》:麦克里斯特尔教你打造应对不确定性的敏捷团队...
  3. python sanic openapi_2020年了,python的web framework sanic 可以考虑生产环境部署了么?...
  4. JavaWeb(十七)——JSP中的九个内置对象
  5. nuxt.js的核心代码_Nuxt.js中的通用应用程序代码结构
  6. 如何消除代码山中那一大坨参数列表
  7. MySQL中 limit和offset用法
  8. 【学习笔记】cs231n-assignment1-two_layer_net
  9. 用ZK UI解决storm 读取Kafka时的Fetch offset *** is out of range for topic , resetting offset
  10. Logistic回归公式推导和代码实现和Python中的sklearn.linear_model.LogisticRegression 的参数
  11. Watir的操作使用
  12. hpm1216nfh驱动程序_惠普m1216nfh
  13. excel多元线性拟合_多元线性回归EXCEL图表
  14. 单片机的ISP是什么
  15. 天虹办公系统kk服务器,客户齐点赞,蓝凌KK 7.0大幅提升工作效率
  16. IDEA起步(一) - 工程结构
  17. Android平板app开发布局文件,Android平板开发相关
  18. Java 位数不足自动补全添加0
  19. 几个cve漏洞库查询网站
  20. 奥付云荣获2017年度企业级创新应用 Top 50

热门文章

  1. 洛谷P2698 花盆Flowerpot【单调队列】
  2. [CATARC_2017] 第八周
  3. 如何提高VS2010的性能,VS2010不再…
  4. 【2011.9.29】得到明天的时间,得到明天某时刻和现在的时间差(毫秒)
  5. HTML中利用纯Microsoft Ajax Library做出可调用WebSerives的AutoComplete
  6. 电脑和树莓派之间文件传输
  7. 大数据之-Hadoop3.x_Yarn_生产环境核心参数配置案例---大数据之hadoop3.x工作笔记0150
  8. C++_类和对象_对象特性_构造函数和析构函数---C++语言工作笔记040
  9. java在线支付---04_编写易宝支付的客户端加密工具类
  10. Android异常总结---1.Android java.net.SocketException: Address family not supported by protocol