基本数据结构:树(tree)

参考博客

(1)基本数据结构:树(tree) - andyidea - 博客园

(2)《大话数据结构》

(3)《啊哈!算法》

1、树的相关定义

(1)树:包含n(n>0)个节点的有穷集合,其中每个元素称为节点(node);有一个特定的节点被称为根节点或树根(root);除根节点之外的其余数据元素被分为m(m≥0)个互不相交的结合T1,T2,……Tm-1,而其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree)。

(2)节点的度:一个节点含有的子树的个数称为该节点的度;

(3)树的度:一棵树中,最大的节点的度称为树的度;

(4)叶节点或终端节点:度为零的节点称为叶节点;

(5)分支节点或非终端节点:度不为零的节点;

(6)父节点或双亲节点:若一个结点含有子节点,则这个节点称为其子节点的父节点;

(7)子节点或孩子节点:一个节点含有的子树的根节点称为该节点的子节点;

(8)兄弟节点:具有相同父节点的节点互称为兄弟节点;

(9)节点的祖先:从根到该节点所经分支上的所有节点;

(10)子孙:以某节点为根的子树中任一节点都称为该节点的子孙。

(11)节点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推;

(12)树的深度或高度:定义一棵树的根结点层次为1,其他节点的层次是其父结点层次加1。一棵树中所有结点的层次的最大值称为这棵树的深度。

(13)森林:由m(m>=0)棵互不相交的树的集合称为森林。

2、树的分类

根据树的形态,可以将树分为两类,即二叉树、多叉树。

其中二叉树包括满二叉树、完全二叉树、斜树。

多叉树是根据应用特性而命名的树,比如线索二叉树、平衡二叉树、二叉排序树、多路查找树(2-3树、2-3-4树、B树、B+树等)、最小生成树等,本质是上述两种类型。

3、树的特点和性质

由于实际中二叉树用得最多,而且多叉树可以转化成二叉树,因此主要讲二叉树的性质。

性质1:在二叉树的第i层上,至多有2^(i-1)个节点。

性质2:深度为k的二叉树,至多有2^k-1个节点。

性质3:对任何的一颗二叉树,如果其终端节点数为n0,度为2的节点数为n2,则有n0=n2+1。

性质4:具有n个节点的完全二叉树的深度为 [ log2(n) ]+1([ x ]表示不大于x的最大整数)。

性质5:有n个节点的完全二叉树,从第一层到[ log2(n) ]+1层,每层从左到右编号,对任一节点i,如果i=1,则是二叉树的根;如果i>1,则 [ i / 2 ]是其父节点;如果2i>n,则i无左孩子,否则其左孩子是2i;如果2i+1>n,则节点无右孩子,否则右孩子是2i+1。

4、树的表示(存储结构)

由于实际中二叉树用得最多,而且多叉树可以转化成二叉树,因此主要讲二叉树的存储结构,即如何表示二叉树结构,和创建实际的二叉树。这里有几种表示方法:

(1)孩子兄弟表示法:每个节点设置两个指针,分别指向该节点的第一个孩子和此节点的兄弟。

typedef struct TreeNode
{int data;//other data informationstruct TreeNode *fisrtchild;struct TreeNode *BrotherNode;
}node;

(2)子节点表示法;

(3)父节点表示法;

5、树的操作与用途

(1)遍历二叉树,如前序、后序、中序遍历(并推导遍历结果);

(2)对树进行节点的删减和添加;

(3)运用于查找(平衡二叉树、多路查找树),排序((堆)排序等)等;

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

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

相关文章

参数估计方法简介

1.参数估计和非参数估计 前面提到随机变量的分布不是很明确时&#xff0c;我们需要先对随机变量的分布进行估计。有一种情况是我们知道变量分布的模型&#xff0c;但是具体分布的参数未知&#xff0c;我们通过确定这些未知参数就可以实现对变量的估计&#xff0c;这种方式就是参…

VMware Workstation 8下Ubuntu 13.04中安装VMware Tools出错

vm 8.0上安装ubuntu 13.04系统以后&#xff0c;需要安装一个vm tool 方便屏幕适应和文件拷贝&#xff0c;但是发现由于ubuntu 13.04 使用的内核太新了&#xff0c;而vm8.0 不能够提供这样的文件&#xff0c;导致安装失败。现在总结一下解决方法。首先下载最新版本的linux 头文件…

如何在工作组环境win 7远程管理Hyper-v server R2 SP1配置(三)

在 如何在工作组环境win 7远程管理Hyper-v server R2 SP1配置&#xff08;二&#xff09; 文中末尾&#xff0c;出现下图报错&#xff1a; 一般情况下&#xff0c;按上篇提到的hvremote.wsf 脚本配置说明文件HVRemote Documentation操作后&#xff0c;不会出现此报错&#xff0…

异或运算交换两个整数

异或运算有两个特性&#xff1a; 1、一个数异或本身恒等于0&#xff0c;如5^5恒等于0&#xff1b; 2、一个数异或0恒等于本身&#xff0c;如5^0恒等于5。 基于此&#xff0c;交换操作如下&#xff1a; aa^b; bb^a; ab^a;

Liferay中使用portlet:resourceURL触发serveResource()方法调用的细节

引入&#xff1a;大家在Portlet 开发中经常用到<portlet:resourceURL>&#xff0c;而大体上都会去调用相应的serveResource()方法&#xff0c;这个过程虽然大家都清楚&#xff0c;但是能弄明白这个过程细节的&#xff0c;我相信全世界不超过100人&#xff0c;至少我去年就…

使用ESP定律_手工脱壳

ESP定律脱壳一般的加壳软件在执行时&#xff0c;首先要初始化&#xff0c;保存环境&#xff08;保存各个寄存器的值&#xff09;&#xff0c;一般利用PUSHAD&#xff08;相当于把所有寄存器都压栈&#xff09;&#xff0c;当加壳程序的外壳执行完毕以后&#xff0c;再来恢复各个…

原码、反码、补码,以及负数的位操作

1、 原码&#xff1a;将符号位数码化了的数&#xff0c;其中“”用0表示&#xff0c;“-”用1表示。 反码&#xff1a;正数的反码表示与原码表示一样&#xff1b;负数的反码表示是原码表示的符号位不变&#xff0c;数值位逐位取反。 补码&#xff1a;正数的补码表示与原码表…

IT菜鸟之DHCP

DHCP 动态主机配置协议&#xff08;Dynamic host configuration protocol&#xff09;作用&#xff1a;分配网络地址选项&#xff1a;excluded-address 排除地址pool IP地址池&#xff08;网段 - 排除地址 地址池&#xff09;relay DHCP代理服务器&#xff08;无用&#xff09…

override render 方法

有时候需要在ASP.net 或MVC 中在页面呈现前&#xff0c;把要显示的内容作一个拦截&#xff0c;更改内容后显示。 只要重写 protected override void Render(System.Web.UI.HtmlTextWriter writer) 方法。 例如&#xff1a; 我把返回的内容中的html 的标题进行改变&#xff0c;…

Sliverlight MD5

突然想在WP上用MD5 &#xff0c;c#的MD5方法在SL下是不能用的额 搜索下MSDN&#xff0c;找到解决方法&#xff1a; http://archive.msdn.microsoft.com/SilverlightMD5 下载那两个类添加到工程中&#xff0c;然后添加代码: 1: protected string GetMD5Hash(string input) 2: { …

“指针+1”的理解

1、一个32位的机器&#xff0c;该机器的指针是多少位的&#xff1f; 指针是多少位只要看地址总线的位数就行了&#xff0c;80386以后的机子都是32的地址总线&#xff0c;所以指针的位数就是4个字节了。 2、指针加1&#xff0c;结果是对该指针增加1个储存单位。 &#xff08;…

apache-apollo启动报错

启动Apollo后&#xff0c;进入网页版管理中心后报错&#xff1a;500: Server Error https://127.0.0.1:61681/console/index.html 网页抓包 报错&#xff1a;{"code":"500: Internal Server Error","message":"java.lang.IllegalArgumentEx…

android 标签对应的代码怎么写alignParentRight、marginRight

2019独角兽企业重金招聘Python工程师标准>>> android:layout_alignParentRight"true" LayoutParams lp new LayoutParams(mp); lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 转载于:https://my.oschina.net/zhangjie830621/blog/158899

TinyXML保存UTF-8编码的XML

最近的项目在Linux下用到了TinyXML库&#xff0c;但是输出xml中的中文总是显示乱码&#xff0c;用UltraEdit查看输出文件为ASCII编码&#xff0c;求助Google大神&#xff0c;发现只需要将tinyxml.cpp源文件中的3处useMicrosoftBOM false;改为useMicrosoftBOM true;即可输出UT…

位操作实现加减乘除

一、常见功能的位操作实现&#xff1a; &#xff08;1&#xff09;常用的等式&#xff1a;-n ~(n-1) ~n1&#xff1b; &#xff08;2&#xff09;获取整数n的二进制中最右边一个1&#xff1a;n&(-n)或者n&~(n-1)&#xff0c;如&#xff1a;n010100&#xff0c;则-n…

【随笔】About QWERTY

QWERTY键盘排布的最初目的是为了减慢人们的打字速度从而减缓对机器的压力&#xff0c;虽然随着时间的推移机器的处理能力越来越强&#xff0c;但是人们已然习惯了QWERTY键盘的打字习惯&#xff0c;所以QWERTY键盘布局被保留了下来。但是有一点奇怪的是QWERTY键盘被原封不动的照…

windows系统c++多线程开发

线程的一些基本概念 一、线程的基本概念。 基本概念&#xff1a;线程&#xff0c;即轻量级进程&#xff08;LWP:LightWeight Process&#xff09;&#xff0c;是程序执行流的最小单元。一个标准的线程由线程ID、当前指令指针&#xff08;PC&#xff09;&#xff0c;寄存器集合…

centos 下安装配置nfs服务器

1、环境centos5.6_x64iptables 关闭selinux 开启&#xff08;这个好像不影响&#xff09;服务端&#xff1a;192.168.10.150客户端&#xff1a;192.168.10.1522、安装yum install portmap //默认已安装yum install nfs-utils3、创建共享目录mkdir /nfsvim /etc/exports/nfs 19…

使用FTP获取RFC文档

连接FTP服务器主机&#xff1a; ftp FTP.RFC-EDITOR.ORG 21&#xff08;21是FTP中控制连接的端口号&#xff09;输入用户名&#xff1a;anonymous输入密码&#xff1a;namehost.domainRFC文档是放在in-notes/rfcxxxx.txt中的&#xff08;xxxx是RFC文档的编号&#xff09;&#…

XP系统安装SQL2000企业版开启1433端口

1.获得SQL2000安装包2.获得SQL2000.MSDE-KB884525-SP4-CHS.EXE/SQL2000-KB884525-SP4-X86-CHS.EXE补丁包微软官网有下载3.在SQL2000 的安装盘中找到MSDE这个目录&#xff0c;并且点击setup.exe安装&#xff0c;完成后重启。4.再次安装SQL2000客户端工具&#xff0c;完成后重启5…