树的定义:
树(tree)是由n(n>=0)个结点或元素)构成的有限集合(记为T)。
n=0,它是一颗空树,这是树的特例。
n>0,这n个结点中有且仅有一个结点作为树的根结点,简称为根(root),其余结点可分 为m(m>=0)个互不相交的有限集T1,T2,.......,Tn,其中每个子集本身又是一颗符合定义的 树,称为根结点的子树(subtree)。
子树是不相交的;
除了根结点外,每个结点有且仅有一个父结点;
一颗n个结点的树有n-1条边
树的逻辑表达方法:
1.树形表示法
2.文氏图表示法
3.凹入表示法
4.括号表示法
如图所示:
树的基本术语:
(1)结点的度(Degree)和树的度:树中某个结点的子树的个数称为结点的度(degree of node),树中所有结点的度中的最大值称为树的度(degree of tree),通常将度为m的树称为m次树(m-tree)。
(2)父结点(Partent):有子树的结点是其子树的根结点的父结点
(3)分支结点与叶子结点:树中度不为0的结点称为非终端结点,又称分支节点(breach)。度为0的
结点称为叶子结点(leaf)。在分支结点中,每个结点的分支树就是该结点的度。如度为1的结点,
其分支数为1,被称为单分支结点;度为2的结点,其分支数为2,被称为双分支结点,依次类推。
(4)路径与路径长度:对于树中任意两个结点Ki和Kj,路径(path)就是指从Ki出发“自上而下”到达Kj
所通过的树中结点的序列。路径长度(path length)就是该路径所通过的结点数目-1(既路径上分支
数目)。
(5)孩子结点与双亲结点:在一棵树中,每个结点的后继结点称为该结点的孩子结点(childern),相应地,该结点被称为孩子结点的双亲结点(parents)。
(6)兄弟节点:具有同一双亲结点的孩子结点互称为兄弟结点(sibling)。
(7)堂兄弟结点:双亲不同,层树相同的结点。
(8)子孙结点:某一结点对应的子树中的所有结点(除自身外)称为该结点的子孙结点(descendant)。
(9)祖先结点:从根结点达到某个结点的路径上经过的所以结点称为该结点的祖先结点(ancestor)。
(10)结点层次和树的高度:树中每一个结点都处于一定的层次。结点层次(level)或结点深度(depth)是从树根开始定义的,根结点为第一层,他的孩子结点为第二层,依次类推,一个结点所在的层次为其双亲结点的层次加1。树中结点的最大层次称为树的高度(height of tree)或树的深度(depth of tree)。
(11)森林:n(n>0)个互不相交的树的集合称为森林。把含有多棵子树的树的根结点删去就成了森林(forest)。反之,给m(m>1)棵独立的树加上一个根结点,并把这m棵树作为该结点的子树,则森林就变成了一棵树。
(12)有序树与无序树:若树中各结点的子树是按照一定次序从左往右安排的,且相对次序是不能随意变换的,则称为有序树(ordered tree),否则称为无序树(unordered tree)。
树的性质:
性质1:树中的结点树等于所有结点的度数之和加1。
性质2:度为m的树中第i层最多有个结点(i>=1)。
性质4:具有n个结点的m次树的最小高度为[]。m为底注找不到向上取整符号用[]代替
树的基本运算:
由于树属于非线性结构,结点之前的关系比线性结构复杂,树的运算主要分为以下3个大类:
(1).寻找满足某种特定条件的结点,如寻找当前结点的双亲结点等;
(2).插入或删除某个结点,如在树的指定结点上插入一个孩子结点或删除指定结点的第i个孩子结点等;
(3).遍历树中的所有结点。
遍历(traversal):按照某种规则把所有的元素都访问一遍。(不重复,每个元素只访问一次)
树的遍历方式主要有三种:
先根遍历(preorder traversal)——先序遍历
先访问根结点,然后再访问左子树,最后访问右子树。
后根遍历(postorder traversal)——后序遍历
先访问左子树,再访问右子树,最后访问根节点。
层次遍历(level traversal)——层序遍历
先访问根结点,再按从上到下、从左到右访问结点。
树的存储结构:
双亲存储结构(parent storage structure)
它是一种顺序存储结构
孩子链存储结构(child chain storage structure)
孩子兄弟存储结构(child borther chain storage struture)
二叉树的定义:
二叉树(binary tree)是一个有穷的结点集合。这个集合可以为空;或者由一个根结点和两棵互不相交的称为左子树(left subtree)和右子树(right subtree)的二叉树组成。
二叉树基本特征:
每个结点的度最大为2
左右子树次序不能颠倒,是一种有序树
二叉树与2次数(度为2的树)的区别:
2次树中至少有一个结点的度为2,而二叉树没有这种要求
2次树不区分左、右子树,而二叉树严格区分左、右子树。
二叉树具有的五种基本形态
1.空树
2.只有一个结点
3.一个结点+其左子树(既右子树为空)
4.一个结点+其右子树(既右子树为空)
5.一个结点的左右子树都非空
如图:
二叉树也有树形表示法、文氏图表示法、凹入表示法、括号表示法等。树的所有术语对二叉树同样适用。
满二叉树(full binary tree):一个深度为i的满二叉树,且结点总数是。(既除了叶子结点外其余结点的度数均为2)
完全二叉树(complete binary tree):若设二叉树的深度为i,除第 i层外,其它各层 (1~i-1) 的结点数都达到最大个数,第i 层所有的结点都连续集中在最左边,这就是完全二叉树。
非空满二叉树特点:
叶子结点都在最下一层;
只有度为0和度为2的结点。
非空完全二叉树的特点:
叶子结点只可能再最下面两层出现;
对于最大层次中的叶子结点,都依次排列在该层最左边的位置上;
如果有度为1的结点,只可能只有一个,且该结点只有左孩子而无右孩子;
按层序编号时,出现编号为i的结点是叶子结点或只有左孩子,编号>i的结点均为叶子结点;
当结点总数n为奇数时,n1 (度为1的结点)= 0; 当结点总数n为偶数时,n1 = 1;
满二叉树与完全二叉树的联系:
满二叉树 是 完全二叉树
完全二叉树 不一定是 满二叉树
二叉树的性质:
设: n:总的节点数
n0:度为0(叶子)的结点数
n1:度为1的结点数
n2:度为2的结点数
总结点数 n = n0+n1+n2
所有结点的度数之和 = n -1 = n1 + 2n2
性质1:非空二叉树上叶子结点数等于双分支结点数加1。(n0 = n2+1)
性质2:非空二叉树的第i层上最多有个结点(i>=1)。
性质3:高度为h的二叉树最多有个结点(h>=1)。
性质4: 完全二叉树性质(含n为结点):
n为奇数n1=0,n为偶数n1=1:
若i≤[n/2]([]表示向下取整),则编号为i的结点为分支结点,否则为叶子结点。
分支结点:1~~[n/2]([]表示向下取整) ,叶子支结点:[n/2]+1~~n([]表示向下取整)
除树根结点外,若一个结点的编号为i,则它的双亲结点的编号为[i/2]([]表示向下取整)。
若编号为i的结点有左孩子结点,则左孩子结点的编号为2i;若编号为i的结点有右孩子结点,则右孩子结点的编号为2i+1。
性质5:具有n个结点的完全二叉树的高度为[]或[+1] 注2为底,[]表示向下取整)
二叉树与树、森林之间的转换:
将一棵树转换为二叉树:
(1)将树中所有相邻的兄弟结点之间连起来;
(2)对树中的所有结点保留他与长子的连线,删除与其它孩子的连线;
(3)原有线条变成左分支,后有线条变为右分支。
如图所示:
将森林转换为二叉树:
(1)将森林里的每一棵树转化为二叉树;
(2)第一颗二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子结点,当所有二叉树连在一起后,此时得到得二叉树就是由森林转换得到得二叉树。
如图所示:
将二叉树还原为树:
(1)若某结点是其双亲的左孩子,则把该结点的右孩子、右孩子的右孩子等都与该结点的双亲结点连起来;
(2)删除原二叉树中所有双亲结点与右孩子结点的连线;
(3)整理前两步得到的树,得到了树。
如图所示:
将二叉树还原为森林:
(1)从根节点开始,找出右分支以及右分支的延续(根->右孩子->右孩子->右孩子->...)。把这条线上的所有右分支删除;
(2)找出所有的右分支以及右分支的延续,看看这条线上最左端的节点的双亲是谁,把这条线上其余的节点和双亲连上线条。最后删除所有的右分支。;
(3)整理得到森林。
如图所示: