数据结构C学习.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《数据结构C学习.pptx》由会员分享,可在线阅读,更多相关《数据结构C学习.pptx(137页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2023/3/25树 -树的定义和术语 两种树:自由树与有根有序树。自由树:一棵自由树Tf可定义为一个二元组Tf=(V,E),其中V=v1,.,vn是由n(n0)个元素组成的有限非空集合,称为顶点(vertex)集合。E=(vi,vj)|vi,vjV,1 i,jn是n-1个序对的集合,称为边集合,E中的元素(vi,vj)称为边(edge)或分支。第1页/共137页2023/3/25树 -树的定义和术语 有根树:一棵有根树T,简称为树,它是n(n0)个结点的有限集合。当n=0时,T称为空树;否则,T是非空树,记作其中,r是一个特定的称为根(root)的结点,它没有直接前驱;根以外的其他结点划分为
2、m(m0)个互不相交的有限集合T1,T2,Tm,每个集合又是一棵树,并且称之为根的子树。第2页/共137页2023/3/25树 -树的定义和术语 相关术语子女:若结点的子树非空,结点子树的根即为该结点的子女。双亲:若结点有子女,该结点是子女双亲。兄弟:同一结点的子女互称为兄弟。度:结点的子女个数即为该结点的度;树中各个结点的度的最大值称为树的度。分支结点:度不为0的结点即为分支结点,亦称为非终端结点。第3页/共137页2023/3/25树 -树的定义和术语 叶结点:度为0的结点即为叶结点,亦称为终端结点。祖先:某结点到根结点的路径上的各个结点都是该结点的祖先。子孙:某结点的所有下属结点,都是该
3、结点的子孙。结点的层次:规定根结点在第一层,其子女结点的层次等于它的层次加一。以此类推。深度:结点的深度即为结点的层次;离根最远结点的层次即为树的深度。第4页/共137页2023/3/25树 -树的定义和术语 高度:规定叶结点的高度为1,其双亲结点的高度等于它的高度加一。树的高度:等于根结点的高度,即根结点所有子女高度的最大值加一。有序树:树中结点的各棵子树T0,T1,是有次序的,即为有序树。无序树:树中结点的各棵子树之间的次序是不重要的,可以互相交换位置。森林:森林是m(m0)棵树的集合。第5页/共137页2023/3/25树 -树的抽象数据类型template class Tree/在类界
4、面中的 position 是树中结点的地址。在顺序/存储方式下是下标型,在链表存储方式下是指针型public:Tree();Tree();positionRoot();BuildRoot(constT&value);/建立树的根结点第6页/共137页2023/3/25树 -树的抽象数据类型positionFirstChild(positionp);/返回p第一个子女地址,无子女返回0positionNextSibling(positionp);/返回p 下一兄弟地址,若无下一兄弟返回0positionParent(positionp);/返回 p 双亲结点地址,若 p 为根返回0TgetDat
5、a(positionp);/返回结点 p 中存放的值boolInsertChild(constpositionp,constT&value);/在结点 p 下插入值为 value 的新子女,若插 /入失败,函数返回false,否则返回true第7页/共137页2023/3/25树 -树的抽象数据类型boolDeleteChild(positionp,inti);/删除结点p的第 i个子女及其全部子孙结/点,若删除失败,则返回false,否则返回truevoidDeleteSubTree(positiont);/删除以t为根结点的子树 bool IsEmpty();/判树空否,若空则返回true
6、,否则返回falsevoidTraversal(void(*visit)(positionp);/遍历以 p为根的子树;第8页/共137页2023/3/25二叉树-二叉树的定义 一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。第9页/共137页2023/3/25二叉树-二叉树的性质 性质1若二叉树结点的层次从1开始,则在二叉树的第i(i1)层最多有2i-1个结点。证明用数学归纳法性质2深度为k(k0)的二叉树最少有k个结点,最多有2k-1个结点。证明:因为每一层最少要有1个结点,因此,最少结点数为k。最多结点个数借助性质
7、1用求等比级数前k项和的公式20+21+22+2k-1=2k-1第10页/共137页2023/3/25二叉树-二叉树的性质 性质3对任何一棵二叉树,如果其叶结点有n0个,度为2的非叶结点有n2个,则有n0n21证明:若设度为1的结点有n1个,总结点数为n,总边数为e,则根据二叉树的定义,n=n0+n1+n2,e=2n2+n1=n-1因此,有2n2+n1=n0+n1+n2-1则n2=n0-1n0=n2+1第11页/共137页2023/3/25二叉树-二叉树的性质 定义1 满二叉树(FullBinaryTree):深度为k的满二叉树是有2k-1个结点的二叉树。定义2 完全二叉树(CompleteB
8、inaryTree):若设二叉树的深度为k,则共有k层。除第k层外,其它各层(1k-1)的结点数都达到最大个数,第k层从右向左连续缺若干结点,这就是完全二叉树。第12页/共137页2023/3/25二叉树-二叉树的性质 性质4 具有n(n0)个结点的完全二叉树的深度为log2(n+1)。证明:设完全二叉树的深度为k,则有2k-1-1n2k-1即2k-1n+12k,取对数k-11,则i的双亲为 i2;3)若2*i=n,则i的左子女为2*i;4)若2*i+1=n,则i的右子女为2*i+1;5)若i为奇数,且i!=1,则其左兄弟为i-1;6)若i为偶数,且i!=n,则其右兄弟为i+1;7)结点i所在
9、的层次为 log2i+1第14页/共137页2023/3/25二叉树-二叉树的抽象数据类型template class BinaryTreepublic:BinaryTree();/构造函数 BinaryTree(BinTreeNode *lch,BinTreeNode*rch,Titem);/构造函数,以item为根,lch和rch为左、/右子树构造一棵二叉树 int Height();/求树深度或高度 int Size();/求树中结点个数第15页/共137页2023/3/25二叉树-二叉树的抽象数据类型bool IsEmpty();/判二叉树空否?BinTreeNode*Parent(B
10、inTreeNode *current);/求结点current的双亲 BinTreeNode*LeftChild(BinTreeNode*current);/求结点current的左子女 BinTreeNode*RightChild(BinTreeNode *current);/求结点current的右子女 bool Insert(Titem);/在树中插入新元素 bool Remove(Titem);/在树中删除元素 bool Find(constT&item)const;/判断item是否在树中第16页/共137页2023/3/25二叉树-二叉树的抽象数据类型bool getData(c
11、onstT&item)const;/取得结点数据BinTreeNode*getRoot()const;/取根void preOrder(void(*visit)(BinTreeNode *p);/前序遍历,visit是访问函数void inOrder(void(*visit)(BinTreeNode *p);/中序遍历,visit是访问函数void postOrder(void(*visit)(BinTreeNode *p);/后序遍历,(*visit)是访问函数voidlevelOrder(void(*visit)(BinTreeNode*p);/层次序遍历,visit是访问函数;第17页/
12、共137页2023/3/25二叉树-二叉树的数组存储表示 第18页/共137页2023/3/25二叉树-二叉树的链表存储表示 二叉链表和三叉链表的概念二叉树结点定义:每个结点有3个域,data域存储结点数据,leftChild和rightChild分别存放指向左子女和右子女的指针。二叉链表如下图所示:第19页/共137页2023/3/25二叉树-二叉树的链表存储表示 每个结点增加一个指向双亲的指针parent,使得查找双亲也很方便。第20页/共137页2023/3/25二叉树-二叉树的链表存储表示 整个二叉树的链表有一个表头指针,他指向二叉树的根结点。在含有n个结点的二叉链表中有n+1个空链指
13、针域,三叉链表则有n+2个空链指针域。2n-(n-1)=n+1n+1+1=n+2第21页/共137页2023/3/25二叉树-二叉树的链表存储表示 二叉树的链表表示第22页/共137页2023/3/25二叉树-二叉链表的类定义 template struct BinTreeNode/二叉树结点类定义 T data;/数据域 BinTreeNode*leftChild,*rightChild;/左子女、右子女链域 BinTreeNode():leftChild(NULL),rightChild(NULL)/构造函数 BinTreeNode(Tx,BinTreeNode*l=NULL,BinTre
14、eNode*r=NULL)data=x;leftChild=l;rightChild=r;第23页/共137页2023/3/25二叉树-二叉链表的类定义 template class BinaryTree/二叉树类定义public:BinaryTree():root(NULL)/构造函数 BinaryTree(Tvalue):RefValue(value),root(NULL)/构造函数 BinaryTree(BinaryTree&s);/复制构造函数 BinaryTree()destroy(root);/析构函数第24页/共137页2023/3/25二叉树-二叉链表的类定义 bool IsE
15、mpty()return root=NULL;/判二叉树空否BinTreeNode*Parent(BinTreeNode *current)/返回双亲结点 return(root=NULL|root=current)?NULL:Parent(root,t);BinTreeNode*LeftChild(BinTreeNode*current)/返回左子女 return(current!=NULL)?current-leftChild:NULL;第25页/共137页2023/3/25二叉树-二叉链表的类定义 BinTreeNode*RightChild(BinTreeNode*current)/返
16、回右子女return(current!=NULL)?current-rightChild:NULL;int Height()return Height(root);/求树高度int Size()return Size(root);/求结点数BinTreeNode*getRoot()const returnroot;/取根voidpreOrder(void(*visit)(BinTreeNode*p)preOrder(root,visit);/前序遍历第26页/共137页2023/3/25二叉树-二叉链表的类定义 voidinOrder(void(*visit)(BinTreeNode*p)in
17、Order(root,visit);/中序遍历voidpostOrder(void(*visit)(BinTreeNode*p)postOrder(root,visit);/后序遍历voidlevelOrder(void(*visit)(BinTreeNode*p);/层次序遍历int Insert(const Titem);/插入新元素BinTreeNode*Find(T item)const;/搜索第27页/共137页2023/3/25二叉树-二叉链表的类定义 protected:BinTreeNode*root;/二叉树的根指针 TRefValue;/数据输入停止标志 void Crea
18、teBinTree(istream&in,BinTreeNode*&subTree);/从文件读入建树 bool Insert(BinTreeNode*&subTree,const T&x);/插入 void destroy(BinTreeNode *&subTree);/删除 bool Find(BinTreeNode *subTree,const T&x);/查找第28页/共137页2023/3/25二叉树-二叉链表的类定义 BinTreeNode*Copy(BinTreeNode *orignode);/复制int Height(BinTreeNode *subTree);/返回树高度i
19、nt Size(BinTreeNode *subTree);/返回结点数BinTreeNode*Parent(BinTreeNode *subTree,BinTreeNode*current);/返回父结点BinTreeNode*Find(BinTreeNode *subTree,constT&x)const;/搜寻xvoid Traverse(BinTreeNode *subTree,ostream&out);/前序遍历输出第29页/共137页2023/3/25二叉树-二叉链表的类定义 voidpreOrder(BinTreeNode&subTree,void(*visit)(BinTree
20、Node*p);/前序遍历voidinOrder(BinTreeNode&subTree,void(*visit)(BinTreeNode*p);/中序遍历voidpostOrder(BinTreeNode&Tree,void(*visit)(BinTreeNode*p);/后序遍历friend istream&operator(istream&in,BinaryTree&Tree);/重载操作:输入friend ostream&operator(ostream&out,BinaryTree&Tree);/重载操作:输出;第30页/共137页2023/3/25二叉树-二叉链表的函数实现/私有函
21、数:删除根为subTree的子树template void BinaryTree:destroy(BinTreeNode *subTree)if(subTree!=NULL)destroy(subTree-leftChild);/删除左子树 destroy(subTree-rightChild);/删除右子树 delete subTree;/删除根结点 第31页/共137页2023/3/25二叉树 -二叉链表的函数实现/从结点 subTree 开始,搜索结点 current的双亲,/若找到则返回双亲结点地址,否则返回NULL template BinTreeNode*BinaryTree:Pa
22、rent(BinTreeNode *subTree,BinTreeNode *current)if(subTree=NULL)return NULL;if(subTree-leftChild=current|subTree-rightChild=current)return subTree;/找到,返回父结点地址第32页/共137页2023/3/25二叉树 -二叉链表的函数实现BinTreeNode *p;if(p=Parent(subTree-leftChild,current)!=NULL)/递归在左子树中搜索 return p;else return Parent(subTree-rig
23、htChild,current);/递归在右子树中搜索 第33页/共137页2023/3/25二叉树 -二叉链表的函数实现/前序遍历输出template void Traverse(BinTreeNode *subTree,ostream&out)if(subTree!=NULL)outdataleftChild,out);Traverse(subTree-rightChild,out);第34页/共137页2023/3/25二叉树 -二叉链表的函数实现/输入并建立一棵二叉树Tree。in是输入流对象。templateistream&operator (istream&in,BinaryTre
24、e&Tree)CreateBinTree(in,Tree.root);/建立二叉树 return in;第35页/共137页2023/3/25二叉树 -二叉树的遍历二叉树的遍历(BinaryTreeTraversal)就是按某种次序访问树中的结点,要求每个结点访问一次且仅访问一次。“访问”的意思是对结点施行某些操作。令L、R、V分别代表遍历一个结点的左子树、右子树和访问该结点的操作,则可能有VLR,LVR,LRV,VRL,RVL,RLV六种遍历二叉树的规则,若规定先左后右则有VLR(前序遍历)、LVR(中序遍历)、LRV(后序遍历)三种。第36页/共137页2023/3/25二叉树 -二叉树的
25、遍历三种遍历算法:先序遍历:访问根结点;先序遍历左子树;先序遍历右子树。中序遍历:中序遍历左子树;访问根结点;中序遍历右子树。后序遍历:后序遍历左子树;后序遍历右子树;访问根结点。第37页/共137页2023/3/25二叉树 -二叉树的遍历二叉树中序遍历的递归算法template void BinaryTree:InOrder(BinTreeNode *subTree,void(*visit)(BinTreeNode*p)if(subTree!=NULL)InOrder(subTree-leftChild,visit);/遍历左子树 visit(subTree);/访问根结点 InOrder(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 学习
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内