ch6树和二叉树
- 格式:ppt
- 大小:1.92 MB
- 文档页数:74
二叉树知识点总结1. 二叉树的性质1.1 二叉树的性质一:二叉树的深度二叉树的深度是指从根节点到叶子节点的最长路径长度。
对于一个空树而言,它的深度为0;对于只有一个根节点的树而言,它的深度为1。
根据定义可知,深度为k的二叉树中,叶子节点的深度值为k。
由此可知,二叉树的深度为所有叶子节点深度的最大值。
1.2 二叉树的性质二:二叉树的高度二叉树的高度是指从根节点到叶子节点的最短路径长度。
对于一个空树而言,它的高度为0;对于只有一个根节点的树而言,它的高度为1。
由此可知,二叉树的高度总是比深度大一。
1.3 二叉树的性质三:二叉树的节点数量对于一个深度为k的二叉树而言,它最多包含2^k - 1个节点。
而对于一个拥有n个节点的二叉树而言,它的深度最多为log2(n+1)。
1.4 二叉树的性质四:满二叉树满二叉树是一种特殊类型的二叉树,它的每个节点要么是叶子节点,要么拥有两个子节点。
满二叉树的性质是:对于深度为k的满二叉树而言,它的节点数量一定是2^k - 1。
1.5 二叉树的性质五:完全二叉树完全二叉树是一种特殊类型的二叉树,它的所有叶子节点都集中在树的最低两层,并且最后一层的叶子节点从左到右依次排列。
对于一个深度为k的完全二叉树而言,它的节点数量一定在2^(k-1)和2^k之间。
2. 二叉树的遍历二叉树的遍历是指按照一定的顺序访问二叉树的所有节点。
二叉树的遍历主要包括前序遍历、中序遍历和后序遍历三种。
2.1 前序遍历(Pre-order traversal)前序遍历的顺序是:根节点 -> 左子树 -> 右子树。
对于一个二叉树而言,前序遍历的结果就是按照“根-左-右”的顺序访问所有节点。
2.2 中序遍历(In-order traversal)中序遍历的顺序是:左子树 -> 根节点 -> 右子树。
对于一个二叉树而言,中序遍历的结果就是按照“左-根-右”的顺序访问所有节点。
2.3 后序遍历(Post-order traversal)后序遍历的顺序是:左子树 -> 右子树 -> 根节点。
⼆叉树⼆叉树 是n(n>=0)个结点的有限集合,该集合或者为空集(空⼆叉树),或者由⼀个根节点和两棵互不相交的、分别称为根节点的左⼦树和右⼦树的⼆叉树组成。
⼆叉树特点: 1)每个结点最多有两颗⼦树,所以⼆叉树中不存在度⼤于2的结点。
2)左⼦树和右⼦树是有顺序的,次序不能任意颠倒。
3)即使树中某结点只有⼀颗⼦树,也要区分是左⼦树还是右⼦树。
⼆叉树具有五种基本形态: 1)空⼆叉树 2)只有⼀个根结点 3)根结点只有左⼦树 4)根结点只有右⼦树 5)根结点既有左⼦树⼜有右⼦树。
三个结点的⼆叉树有5种形态:特殊⼆叉树:1.斜树 顾名思义,斜树⼀定是斜的,但是往哪还是有讲究的。
所有的结点都只有左⼦树的⼆叉树叫做左斜树。
所有的结点都只有右⼦树的⼆叉树叫做右斜树。
斜树有很明显的特点就是每⼀层都只有⼀个结点。
结点的个数与⼆叉树的深度相同。
左斜树 右斜树2.满⼆叉树 在⼀颗⼆叉树中,如果所有分⽀结点都存在左⼦树和右⼦树,并且所有叶⼦都在同⼀层上,这样的⼆叉树称为满⼆叉树。
单是每个结点都存在左右⼦树,不能算是满⼆叉树,还必须要所有的叶⼦都在同⼀层上,这就做到了整棵树的平衡。
因此,满⼆叉树的特点有: 1)叶⼦只能出现在最下⼀层。
出现在其它层就不可能达成平衡。
2)⾮叶⼦结点的度⼀定是2. 3)在同样深度的⼆叉树中,满⼆叉树的结点个数最多,叶⼦数最多。
3.完全⼆叉树 对⼀颗具有n个结点的⼆叉树按层序编号,如果编号为i(1 <= i <= n)的结点与同样深度的满⼆叉树中编号为i的结点在⼆叉树中位置完全相同,则这棵⼆叉树称为完全⼆叉树。
如图⽰:⼆叉树性质:性质1:在⼆叉树的第i层⾄多有2i-1个结点(i >= 1)。
性质2:深度为K的⼆叉树⾄多有2k-1个结点(k >= 1)。
性质3:对任何⼀颗⼆叉树T,如果其终端结点数为n0,度为2的结点树为n2,则n0 = n2 + 1。
性质4:具有n个结点的完全⼆叉树的深度为|log2n| + 1 (|x|表⽰不⼤于x的最⼤整数)。
第6章树和二叉树6.1 知识点概述树(Tree)形结构是一种很重要的非线性结构,它反映了数据元素之间的层次关系和分支关系。
在计算机科学中具有广泛的应用。
1、树的定义树(Tree)是n(n≥0)个数据元素的有限集合。
当n=0时,称这棵树为空树。
在一棵非空树T中:(1)有一个特殊的数据元素称为树的根结点,根结点没有前驱结点。
(2)若n>1,除根结点之外的其余数据元素被分成m(m>0)个互不相交的集合T1,T2,…,Tm,其中每一个集合Ti(1≤i≤m)本身又是一棵树。
树T1,T2,…,Tm称为这个根结点的子树。
2、树的基本存储结构(1)双亲表示法由于树中的每一个结点都有一个唯一确定的双亲结点,所以我们可用一组连续的存储空间(即一维数组)存储树中的结点。
每个结点有两个域:一个是data域,存放结点信息,另一个是parent域,用来存放双亲的位置(指针)。
(2)孩子表示法将一个结点所有孩子链接成一个单链表形,而树中有若干个结点,故有若干个单链表,每个单链表有一个表头结点,所有表头结点用一个数组来描述这种方法通常是把每个结点的孩子结点排列起来,构成一个单链表,称为孩子链表。
(3)双亲孩子表示法双亲表示法是将双亲表示法和孩子表示法相结合的结果。
其仍将各结点的孩子结点分别组成单链表,同时用一维数组顺序存储树中的各结点,数组元素除了包括结点本身的信息和该结点的孩子结点链表的头指针之外,还增设一个域,存储该结点双亲结点在数组中的序号。
(4)孩子兄弟表示法这种表示法又称为树的二叉表示法,或者二叉链表表示法,即以二叉链表作为树的存储结构。
链表中每个结点设有两个链域,分别指向该结点的第一个孩子结点和下一个兄弟(右兄弟)结点。
3、二叉树的定义二叉树(Binary Tree)是个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。
当集合为空时,称该二叉树为空二叉树。
数据结构之树和⼆叉树⼀树1 什么是树树状图是⼀种,它是由n(n>=1)个有限节点组成⼀个具有层次关系的。
把它叫做“树”是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。
它具有以下的特点:每个节点有零个或多个⼦节点;没有⽗节点的节点称为根节点;每⼀个⾮根节点有且只有⼀个⽗节点;除了根节点外,每个⼦节点可以分为多个不相交的⼦树;树(tree)是包含n(n>0)个结点的有穷集,其中:(1)每个元素称为结点(node);(2)有⼀个特定的结点被称为根结点或树根(root)。
(3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,……Tm-1,其中每⼀个集合Ti(1<=i<=m)本⾝也是⼀棵树,被称作原树的⼦树(subtree)。
2 相关术语节点的度:⼀个节点含有的⼦树的个数称为该节点的度;叶节点或终端节点:度为0的节点称为叶节点;⾮终端节点或分⽀节点:度不为0的节点;双亲节点或⽗节点:若⼀个节点含有⼦节点,则这个节点称为其⼦节点的⽗节点;孩⼦节点或⼦节点:⼀个节点含有的⼦树的根节点称为该节点的⼦节点;兄弟节点:具有相同⽗节点的节点互称为兄弟节点;树的度:⼀棵树中,最⼤的节点的度称为树的度;节点的层次:从根开始定义起,根为第1层,根的⼦节点为第2层,以此类推;树的⾼度或深度:树中节点的最⼤层次;堂兄弟节点:双亲在同⼀层的节点互为堂兄弟;节点的祖先:从根到该节点所经分⽀上的所有节点;⼦孙:以某节点为根的⼦树中任⼀节点都称为该节点的⼦孙。
森林:由m(m>=0)棵互不相交的树的集合称为森林;3 树模拟⽂件系统⽰例class Node:def__init__(self, name, type='dir'): = nameself.type = type # "dir" or "file"self.children = []self.parent = Nonedef__repr__(self):return class FileSystemTree:def__init__(self):self.root = Node("/")self.now = self.root # 当前⽬录def mkdir(self, name):# name已/结尾的⽂件夹if name[-1] != "/":name += "/"node = Node(name)self.now.children.append(node)node.parent = self.nowdef ls(self):return self.now.childrendef cd(self, name):if name[-1] != "/":name += "/"if name == "../":self.now = self.now.parentreturnfor child in self.now.children:if == name:self.now = childreturnraise ValueError("invalid dir")tree = FileSystemTree()tree.mkdir("var/")tree.mkdir("bin/")tree.mkdir("usr/")print(tree.root.children)print(tree.ls())tree.cd('bin/')tree.mkdir('python/')print(tree.ls())tree.cd("../")print(tree.ls())⼆、⼆叉树⼆叉树的链式存储:将⼆叉树的节点定义为⼀个对象,节点之间通过类似链表的链接⽅式来连接* 度不超过2的树* 每个节点最多有两个孩⼦节点* 两个孩⼦节点被区分为左孩⼦节点和右孩⼦节点满⼆叉树:⼀个⼆叉树如果每⼀个层的节点数达到最⼤值,则这个⼆叉树就是满⼆叉树完全⼆叉树:叶节点只能出现在最下层和次下层,并且最下⾯⼀层的节点都集中在该层最左边的若⼲位置的⼆叉树⼆叉树的遍历⽅式:前序遍历: EACBDGF中序遍历: ABCDEGF后序遍历: BDCAFGE层次遍历: EAGCFBDfrom collections import dequeclass BiTreeNode:def__init__(self, data):self.data = dataself.lchild = Noneself.rchild = Nonedef level_order(root):queue = deque()queue.append(root)while len(queue) > 0: # 只要栈不空node = queue.popleft()print(node.data, end=',')if node.lchild:queue.append(node.lchild)if node.rchild:queue.append(node.rchild)root = BiTreeNode(100)root.lchild = BiTreeNode(30)root.rchild = BiTreeNode(102)level_order(root)三⼆叉搜索树⼆叉搜索树是⼀棵⼆叉树且满⾜性质:设X是⼆叉树的⼀个节点。