Tree 树形结构
一、树的基本概念
(1)树(Tree)的概念:树是一种递归定义的数据结构,是一种重要的非线性数据结构。
树可以是一棵空树,它没有任何的结点;也可以是一棵非空树,至少含有一个结点。
(2)根(Root):有且仅有一个结点的非空树,那个结点就是根。
(3)子树(Subtree):在一棵非空树中,除根外,其余所有结点可以分为m(m≥0)个互不相交的集合。每个集合本身又是一棵树,称为根的子树。
(4)结点(Node):表示树中的元素及若干指向其子树的分支。
(5)结点的度(Degree):一个结点拥有的子树数目称为该结点的度。
(6)叶子结点(Leaf):度为0的结点。
(7)孩子(Child):结点子树的根称为该结点的孩子。
(8)双亲(Parents):孩子结点的上层结点叫该结点的双亲。
(9)兄弟(Sibling):同一双亲的孩子。
(10)树的度:一棵树中最大的结点度数。
(11)结点的层次(Level):从根结点开始定义根为第一层,它的孩子为第二层,依此类推。
(12)深度(Depth):树中结点最大层次的值。
(13)有序树:树中的各子树自左向右有序的称为有序树。
(14)无序树:树中的各子树自左向右无序的称为无序树。
(15)森林(Forest):是m(m≥0)棵互不相交的树的集合。
(16)祖先:是指从根结点到该结点之间所有的结点。
如图所示:
A是根结点,A结点的度是3,D结点的度是3;因为3是结点的度的最大值,所以这棵树的度是3;E、G、H、I、K、L和M是叶子结点。 A在树的第一层,B、C、D在树的第二层,E、F、G、H、I、J在树的第三层,K、L、M在树的第四层;树的深度是4。 树从左往右是有序的,这是一棵有序树;E结点的祖先是A、B。
二 二叉树
概念:二叉树又叫二分树,它的特点是每个结点最多只有二棵子树,也就是二叉树中没有度大于2的结点。二叉树的子树有左右之分,严格区分左孩子、右孩子,其次序不能颠倒。
满二叉树
概念:一棵深度为k且有2k-1个结点的二叉树称为满二叉树。
完全二叉树
概念:可以对满二叉树的结点进行连续编号,约定编号从根结点起,自上而下,自左至右。由此可以引出完全二叉树的定义。深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应,称之为完全二叉树。
完全二叉树的特点是:
(1)叶子结点只可能在层次最大的两层上出现;(2)对任一结点,若其右分支下的子孙的最大层次为l,则其左分支下的子孙的最大层次必为l或l+1。
三 性质
性质1: 在二叉树的第i层上至多有2i-1个结点(i>=1)
性质2: 深度为k的二叉树至多有2k-1个结点,(k>=1).
性质3: 对任何一棵二叉树T,如果其终端结点数位n0,度为2的结点数为n2,则 n0 = n2 + 1
性质4: 具有n个结点的完全二叉树的深度为 ⌊log2n⌋+1
性质5: 如果对一棵有n个结点的完全二叉树(其深度为 ⌊log2n⌋+1 )的结点按层序编号(从第1层到第 ⌊log2n⌋+1 层,每层从左到右),则对任一结点i(1<=i<=n),有:
(1)如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲PARENT(i)是结点⌊i/2⌋。
(2)如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子LCHILD(i)是结点2i。
(3)如果2i+1>n,则结点i无右孩子;否则其右孩子RCHILD(i)是结点2i+1。
四 python 代码
代码
class Node:
"定义节点类"
def __init__(self,item):
self.item=item
self.lchild=None
self.rchild=None class Tree:
"定义树类"
def __init__(self):
self.root=None def add(self,item):
node=Node(item)
if not self.root:
self.root=node
return
queue=[self.root,]
while queue:
current_node=queue.pop(0)
if current_node.lchild is None:
current_node.lchild=node
return
else:
queue.append(current_node.lchild)
if current_node.rchild is None:
current_node.rchild=node
return
else:
queue.append(current_node.rchild)
def breadth_travel(self):
'''广度遍历'''
if self.root is None:
return
queue=[self.root,] while queue:
current_node=queue.pop(0)
print(current_node.item,end=" ")
if current_node.lchild is not None:
queue.append(current_node.lchild)
if current_node.rchild is not None:
queue.append(current_node.rchild) def preorder(self,node):
'''先序遍历----根->左->右'''
if node is None:
return
print(node.item,end=" ")
self.preorder(node.lchild)
self.preorder(node.rchild) def inorder(self,node):
'''中序遍历----左->中->右'''
if node is None:
return
self.inorder(node.lchild)
print(node.item,end=" ")
self.inorder(node.rchild) def postorder(self,node):
'''后序遍历----左->右->中'''
if node is None:
return
self.postorder(node.lchild)
self.postorder(node.rchild)
print(node.item,end=" ") if __name__ == '__main__':
tree=Tree()
tree.add(0)
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
tree.add(6)
tree.add(7)
tree.add(8)
tree.add(9)
print('-----广度遍历-----')
tree.breadth_travel()
print('\n-----深度先序遍历-----')
tree.preorder(tree.root)
print('\n-----深度中序遍历-----')
tree.inorder(tree.root)
print('\n-----深度后序遍历-----')
tree.postorder(tree.root)
树形结构
结果
-----广度遍历-----
0 1 2 3 4 5 6 7 8 9
-----深度先序遍历-----
0 1 3 7 8 4 9 2 5 6
-----深度中序遍历-----
7 3 8 1 9 4 0 5 2 6
-----深度后序遍历-----
7 8 3 9 4 1 5 6 2 0
好文推荐
原文:https://blog.csdn.net/tfygg/article/details/46763389
原文:https://blog.csdn.net/gavin_john/article/details/72312276
Tree 树形结构的更多相关文章
- 使用ztree.js,受益一生,十分钟学会使用tree树形结构插件
看到ztree.js,这几个字眼,毋庸置疑,那肯定就是tree树形结构了,曾经的swing年代有jtree,后来jquery年代有jstree和treeview,虽然我没写过,但是我见过,一些小功能做 ...
- Jquery EasyUI Tree树形结构的Java实现(实体转换VO)
前一阵做的OA项目,有一个是组织架构的树,因为是分开做的,我做的是Controller和页面,其他组做的Service和Dao,因为之前一直没有商量页面用什么框架做比较好,导致,Dao层取出来的数据都 ...
- Tree树形结构案例+源码
上次用到Tree结构,自己不知道写,就在网上找了几个相对较好的tree小案例,留着自己用,希望也能帮到你 下面是案例的一些图片,压缩文件已近上传至博客当和百度云中. 下载链接:http://pan.b ...
- Linux/Ubuntu tree 命令以树形结构显示文件夹目录结构
1.安装命令工具 sudo apt-get -y install tree 2.可以查看关于tree命令的帮助信息 $ tree --help usage: tree [-adfghilnpqrstu ...
- 【转】linux tree命令以树形结构显示文件目录结构 ---- 不错
原文网址:http://jingyan.baidu.com/article/acf728fd19c7eff8e510a3eb.html 今天小编来给分享Linux 系统下一个非常有用的命令的使用:tr ...
- [转帖]linux tree命令--显示目录的树形结构
linux tree命令--显示目录的树形结构 版权声明:iamqilei@qq.com https://blog.csdn.net/u011729865/article/details/533 ...
- salesforce 零基础学习(七十)使用jquery tree实现树形结构模式
项目中UI需要用到树形结构显示内容,后来尽管不需要做了,不过还是自己做着玩玩,mark一下,免得以后项目中用到. 实现树形结构在此使用的是jquery的dynatree.js.关于dynatree的使 ...
- EasyUI之树形结构tree
转自:https://blog.csdn.net/ya_1249463314/article/details/70305730 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...
- tree:以树形结构显示目录下的内容
tree命令 1.命令详解 [功能说明] tree命令的中文意思为“树”,功能是以树形结构列出指定目录下的所有内容包括所有文件.子目录及子目录里的目录和文件. [语法格式] tree [option] ...
随机推荐
- 【从零开始自制CPU之学习篇00】开篇
从今天开始决定用面包板制作一个8位的CPU,实现几个简单的指令.我给自己分两大部分计划,第一部分是学习制作CPU的理论知识,第二部分是实践.并打算实施计划的同时用博客的方式记录下来.理论知识的部分重点 ...
- C#计算一段代码的运行时间
第一种方法利用System.DateTime.Now: static void SubTest() { DateTime beforDT = System.DateTime.Now; //耗时巨大的代 ...
- UE4 打包C++项目到win32平台报错 could not find mspdbcore.dll
解决方法: 将Visual Studio中相应系统(如32位对应x86.64位对应x64)下的 ms.*.dll 等一系列文件拷贝到 C:\Windows\System32\ 路径下.踩坑:不能只拷贝 ...
- Redis学习——Windows环境下Redis的安装(二)
一.说明 之前介绍了Linux环境下Redis的安装,这次介绍一下Windows环境下Redis的安装,首先要讲的是,Redis官方只支持Linux,还好 Microsoft Open Tech gr ...
- Python爬虫入门教程 8-100 蜂鸟网图片爬取之三
蜂鸟网图片--啰嗦两句 前几天的教程内容量都比较大,今天写一个相对简单的,爬取的还是蜂鸟,依旧采用aiohttp 希望你喜欢 爬取页面https://tu.fengniao.com/15/ 本篇教程还 ...
- Kubernetes 弹性伸缩全场景解析 (四)- 让核心组件充满弹性
前言 在本系列的前三篇中,我们介绍了弹性伸缩的整体布局以及HPA的一些原理,HPA的部分还遗留了一些内容需要进行详细解析.在准备这部分内容的期间,会穿插几篇弹性伸缩组件的最佳实践.今天我们要讲解的是 ...
- 使用MaxCompute Java SDK 执行任务卡住了,怎么办?
场景一 用户AA: “亲,用 MaxCompute Java SDK 跑作业,为什么卡住不动了?”me: “有 Logview 吗?发来看下”A: “没有,我用的是SDK,没Logview” 场景二 ...
- 如何用sysbench做好IO性能测试
sysbench 是一个非常经典的综合性能测试工具,通常都用它来做数据库的性能压测,但也可以用来做CPU,IO的性能测试.而对于IO测试,不是很推荐sysbench,倒不是说它有错误,工具本身没有任何 ...
- [三]java8 函数式编程Stream 概念深入理解 Stream 运行原理 Stream设计思路
Stream的概念定义 官方文档是永远的圣经~ 表格内容来自https://docs.oracle.com/javase/8/docs/api/ Package java.util.s ...
- JS引擎线程的执行过程的三个阶段(二)
继续JS引擎线程的执行过程的三个阶段(一) 内容, 如下: 三. 执行阶段 1. 网页的线程 永远只有JS引擎线程在执行JS脚本程序,其他三个线程只负责将满足触发条件的处理函数推进事件队列,等待JS引 ...