数据结构 第六章树.ppt
《数据结构 第六章树.ppt》由会员分享,可在线阅读,更多相关《数据结构 第六章树.ppt(112页珍藏版)》请在三一办公上搜索。
1、6.1树的类型定义,(1)树型结构实例,(1)树型结构实例,(2)树的类型定义,数据对象D:D是具有相同特性的数据元素的集合数据关系R:若D为空集,则称为空树否则在D中一定存在唯一的称为根的数据元素Root当n1时,其余结点可分为m(m0)个互不相交的有限集T1,T2,Tm,其中每一个子集本身又是一颗符合本定义的树,称为根root的子树,有向树:1、有确定的根 2、树根和子树根之间为有向关系,有序树和无序树之间的区别:子树之间是否存在次序关系?,若为无序树,两棵树相同,若为有序树,两棵树不同,(5)基本操作 查找 插入 删除,查找,Root(T);/查找根结点Value(T,Cur_e);/寻
2、找某结点值或根据值寻找某结点Parent(T,Cur_e);/寻找双亲结点LeftChild(T,Cur_e);/查找最左边孩子结点RightSibling(T,Cur_e);/查找每个孩子的右兄弟TreeEmpty(T);/判断是否为空树TreeDepth(T);/查找树的深度TraverseTree(T,Visit();/遍历树,插入,InitTree(/插入一棵子树,删除,ClearTree(/删除一棵子树,线性结构和树结构的比较,线性结构第一个数据元素(无前驱)最后一个数据元素(无后继)其他数据元素(一个前驱,一个后继),树结构根结点(无前驱)多个叶子结点(无后继)树中其他结点(一个前
3、驱,多个后继),6.2二叉树的类型定义,二叉树或为空树;或是由一个根结点加上两棵分别称为左子树和右子树的、互不交叉的二叉树组成,左子树,右子树,(2)二叉树的五种状态,空树,只有根结点的树,右子树为空的树,左子树为空的树,左右子树均不为空的树,(4)二叉树的主要基本操作,查找 插入 删除,(5)二叉树的重要特性,性质1:在二叉树的第i层上至多有2i-1个结点(i1),i=1,20=1,假设i=k时第i层共有2k-1个结点,当i=k+1时,最多有2k-12个结点,即2(k+1)-1个,对于其中的每一个结点,最多只有两个孩子结点,性质2:深度为k的二叉树上至多含2k-1个结点(k1)证明:20+2
4、1+22+2k-1=2k-1,性质3:对任何一棵二叉树,若它含有n0个叶子结点,n2个度为2的结点,则必存在关系式:n0=n2+1,二叉树中只有三类结点:度为0的结点,度为1的结点,度为2的结点,n0+n1+n2=n(其中n为结点总数),除根结点之外,每一个结点都有一个分支相连,若假设分支个数为b,则n=b+1,度为0的结点不产生分支,度为1的结点产生1个分支度为2的结点产生2个分支,则n1+2n2=b,n0+n1+n2=n1+2n2+1,n0=n2+1,两类特殊的二叉树,满二叉树:指的是深度为k且含有2k-1个结点的二叉树完全二叉树:树中所含的n个结点和满二叉树中编号为1到n的结点一一对应,
5、满二叉树,完全二叉树,性质4:具有n个结点的完全二叉树的深度为log2n+1,深度为k的完全二叉树,2k-1-1n2k-1,2k-1 n 2k,k-1 log2n k,k-1 log2n k,K-1=log2n,性质5:若对含n个结点的完全二叉树从上到下从左到右进行1至n的编号,则对二叉树中任意一个编号为i的结点:(1)若i=1,则该结点为根结点,无双亲,否则,编号为 i/2 的结点为其双亲结点。(2)若2in,则该结点无左孩子,否则,编号为2i的结点为其左孩子结点(3)若2i+1n,则该结点无右孩子,否则,编号为2i+1的结点为其右孩子结点,6.3二叉树的存储结构,1、二叉链表,public
6、 class BiNode private char data;/数据域 private BiNode lChild;/左孩子节点 private BiNode rChild;/右孩子节点/结点 public class BiTree private BiNode head;/头引用/二叉树,A,lChild,rChild,这里的双亲结点的关系是隐含的,三叉链表,2、三叉链表,public class BiNode private char data;/数据域 private BiNode lChild;/左孩子节点 private BiNode rChild;/右孩子节点 private B
7、iNode parent;/双亲结点/结点 public class BiTree private BiNode head;/头引用/二叉树,3、双亲链表,public class BPNode private char data;/数据域 private int parent;/指向双亲的指针 private char lrTag;/左右孩子标志域 public class BPTree private int maxNum;/结点数组最大个数 private BPNode nodes;/结点数组 private int num_node;/现有结点个数 private int root;/
8、根结点所在位置,0,1,2,3,4,5,A,B,C,D,0,0,1,-1,“L”,“R”,“R”,Root=0;Num_node=4;,6.4二叉树的遍历,问题的提出先左后右的遍历算法算法的递归描述遍历的非递归算法描述遍历的应用举例,遍历二叉树:顺着某一条搜索路径巡访二叉树中的结点,使得每一个结点均被访问一次,而且只被访问一次。,“访问”的含义可以很广,如:输出结点的信息,对结点赋值等等。,6.4.1 问题的提出,“遍历”是任何类型均有的操作,对线性结构而言,只有一条搜索路径(因为每个结点只有一个后继),故不需要加以讨论。而二叉树是非线性结构,每个结点都有两个后继,则存在如何遍历即按什么样的搜
9、索路径遍历的问题,对“二叉树”而言,可以有三条搜索路径:先上后下的按层次遍历先左(子树)后右(子树)的遍历先右(子树)后左(子树)的遍历,先左后右的遍历算法,先(根)序的遍历算法中(根)序的遍历算法后(根)序的遍历算法,先(根)序的遍历算法:若二叉树为空树,则空操作;否则访问根结点先序遍历左子树先序遍历右子树,中(根)序的遍历算法:若二叉树为空树,则空操作;否则中序遍历左子树访问根结点中序遍历右子树,后(根)序的遍历算法:若二叉树为空树,则空操作;否则后序遍历左子树后序遍历右子树访问根结点,先序遍历ABDECFGH中序遍历DBEACGFH后序遍历DEBGHFCA,算法的递归描述,先序遍历算法V
10、oid PreOrder(BiTree T)if(T.Head!=null)visit(T);PreOrder(T.LChild);PreOrder(T.RChild);,中序遍历算法Void InOrder(BiTree T)if(T.head!=null)InOrder(T.LChild);visit(T);InOrder(T.RChild);,后序遍历算法Void PostOrder(BiTree T)if(T.head!=null)PostOrder(T.LChild);PostOrder(T.RChild);visit(T);,遍历的非递归算法描述,中序遍历的非递归算法描述,BiNo
11、de GoFarLeft(BiTree T,Stack S)BiNode h=T.Head;if(h=null)return null;while(h.LChild!=null)S.Push(h);h=h.LChild;return h;,void InOrder()Stack S=new Stack();BiNode t=GoFarLeft(this,S);while(t!=null)Console.Write(t.Data);if(t.RChild!=null)BiTree bt=new BiTree();bt.head=t.RChild;t=GoFarLeft(bt,S);else if
12、(S.Count 0)t=S.Pop();else t=null;,遍历的应用举例,1、统计二叉树中叶子结点的个数,public static void CountLeaf(BiTree T,ref int count)if(T.Head!=null)if(T.Head.LChild=null,2、求二叉树的深度(后序遍历),public static int Depth(BiTree T)int depthVal;if(T.Head=null)depthVal=0;else BiTree tl=new BiTree();tl.Head=T.Head.LChild;BiTree tr=new
13、BiTree();tr.Head=T.Head.RChild;int depthLeft=Depth(tl);int depthRight=Depth(tr);depthVal=(depthLeft depthRight?depthLeft:depthRight)+1;return depthVal;,3、建立二叉树的存储结构,按给定的先序序列建立二叉树,A,A,已知二叉树求序列?,已知序列求二叉树?,4、用二叉树表示二元运算符表达式,表达式=,(第一操作数),(运算符),(第二操作数),运算符,(a+b)*c-d/e,-,*,/,C,e,+,a,b,d,先序序列:-*+abc/de,中序序列
14、:a+b*c-d/e,后序序列:ab+c*de/-,前缀表示法(前波兰式),中缀表示法(波兰式),后缀表示法(逆波兰式),先序序列:-*+abc/de,后序序列:ab+c*de/-,给定先序序列:abcd,中序序列:bacd,中序序列:abcd,中序序列:bdca,先序序列:,根,中序序列:,根,中序序列:d c b a g f e,先序序列:a b c d e f g,a,b,c,d,e,f,g,6.5线索二叉树,何谓线索二叉树?如何建立线索链表?,遍历一个二叉树的结果是,求得结点的一个线性序列,指向该线性序列中的“前驱”和“后继”指针,被称为“线索”,包含“线索”的存储结构,称为“线索链表
15、”,与之相对应的二叉树为“线索二叉树”,A,B,E,C,D,F,G,H,F,A,对线索链表中结点的约定:在二叉链表的结点中增加两个标志域,A,B,E,C,D,F,G,H,F,A,若该结点的左子树不空,则LChild域的指针指向其左子树,且左标志域的值为0否则,LChild域的指针指向其“前驱”,且左标志域的值为1,0,0,0,0,1,1,1,1,1,若该结点的右子树不空 则RChild域的指针指向其右子树,且左标志域的值为0否则,LChild域的指针指向其“后继”,且左标志域的值为1,0,1,0,0,0,1,1,1,1,前序线索化二叉树,树有三种存储结构:一、双亲表示法二、孩子链表表示法三、树
16、的二叉链表(孩子-兄弟)存储表示法,6.6树和森林的表示方法,一、双亲表示法 一般采用顺序存储结构实现。用一组地址连续的存储单元来存放树的结点,每个结点有两个域:parent域-存放该结点双亲结点的位置 data域-存放结点的信息;,存储结构描述为:public class PTreeNode/结点 private char data;/数据域 private int parent;/双亲结点位置 public class PTree private int maxTreeSize;/结点总数 private PTreeNode nodes;/结点数组 private int nums;/树结
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第六章树 第六
链接地址:https://www.31ppt.com/p-6578823.html