- 1、本文档共134页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
例:d={a , b , c , d , e } w={50,35,25,20,30} a:11 b:01 c:101 d:100 e:00 20 45 25 50 30 35 65 95 160 e b d c a 0 0 0 0 1 1 1 1 二叉链表存储的实现 int CountLeaf2(BiTree bt) { if(bt==NULL) return 0; if(bt-lchild==NULLbt-rchild==NULL) return 1; return( CountLeaf1(bt-lchild)+CountLeaf2(bt-rchild)); } 3-4 线索二叉树 保存遍历过程中得到的信息以供某些操作使用 (1)增加两个指针 (2)利用结构中的空链域,并设立标志。 线索:指向结点前驱或后继的指针。 线索二叉树:加上线索的二叉树。 线索化:对二叉树以某种次序遍历使其变为线索二叉树的过程。 按对称序线索化二叉树:按对称序周游二叉树,周游到那个结点对那个结点加线索。 按对称序周游对称序穿线树:沿线索周游。 线索二叉树定义及结构 线索二叉树定义 线索二叉树的结构 利用空左指针存放某种遍历序列的直接前驱的存储地址 利用空右指针存放某种遍历序列的直接后继的存储地址 原非空指针仍然保留原来的指向 A B C F E D I 先序线索二叉树 1、为每个结点增设两个标志位域ltag 和 rtag令: ltag= 0 lchild 指向结点的左孩子 1 lchild 指向结点的前驱结点 rtag= 0 rchild 指向结点的右孩子 1 rchild 指向结点的后继结点 ltag lchild data rchild rtag 2、不改变结点结构,仅在作为线索的地址前加一个负号 线索二叉树的基本操作实现 线索二叉树中结点结构定义: typedef struct BiThrNode { TElemtype data; struct BiThrNode *lchild; struct BiThrNode *rchild; unsigned ltag; unsigned rtag; }BiThrNode, *PBinThrTree; 1、非空结点入栈 p=p-lchild; 2、若p为空时 取栈顶元素为当前结点p 并出栈(访问) 如果上一次访问的结点pr不为空 并如果上次访问的结点pr-rchild==NULL 置p为pr的后继; 并如果当前结点p的左子树为空 pr为p的前驱 pr=p (遍历中已访问); p=p-rchild (访问p置pr为已访问结点p,置p为其右子树) 重复以上操作1,2直到p为空且栈空 建立中序线索二叉树 void InOrderThr(BiThrTree t) {BiThrTree stack[MAXNODE]; int top=-1; BiThrTree p,pr; if(t==NULL) return; p=t; pr=NULL; do{ while(p!=NULL) { top++; stack[top]=p;p=p-lchild;} p=stack[top]; top--; if(pr!=NULL) { if(pr-rchild=NULL) {pr-rchild=p; pr-rtag=1;} if(p-lchild=NULL) {p-lchild=pr;p-ltag=1;} } } pr=p; p=p-rchild; } while(top!=-1||p!=NULL) } A B C F E D I p pr A NULL p p p B D p pr p I p p pr p p pr p p pr p p p C E p pr p p pr p p F p pr p 在中序线索二叉树上查找任意结点的中序前驱 BiThree InPreNode(BiThrTree p) { BiThrT
文档评论(0)