当前位置: 首页 > news >正文

贵州省房屋和城市建设厅官方网站建设网站所采用的技术方案

贵州省房屋和城市建设厅官方网站,建设网站所采用的技术方案,源码制作网站,苏州市建设中心网站线索二叉树结构1.线索二插树的作用2.线索二叉树的定义3.线索二叉树的结构4. 线索二叉树的操作4.1. 建立一棵中序线索二叉树4.2. 在中序线索二叉树上查找任意结点的中序前驱结点4.3. 在中序线索二叉树上查找任意结点的中序后继结点4.4. 在中序线索二叉树上查找任意结点在先序下的…

线索二叉树结构

  • 1.线索二插树的作用
  • 2.线索二叉树的定义
  • 3.线索二叉树的结构
  • 4. 线索二叉树的操作
    • 4.1. 建立一棵中序线索二叉树
    • 4.2. 在中序线索二叉树上查找任意结点的中序前驱结点
    • 4.3. 在中序线索二叉树上查找任意结点的中序后继结点
    • 4.4. 在中序线索二叉树上查找任意结点在先序下的后继结点
    • 4.5. 在中序线索二叉树上查找任意结点在后序下的前驱结点
    • 4.6. 在中序线索二叉树上查找值为x的结点
    • 4.7. 中序线索二叉树上的插入与删除
  • 5. 基于中序线索二叉树的遍历算法

1.线索二插树的作用

通过递归算法或者是用栈与队列实现非递归算法都会有额外空间上的开销。利用n个结点有n+1个空指针域来存放线索,然后利用这个线索来实现不用空额外空间来遍历二叉树。

2.线索二叉树的定义

在某种顺序遍历二叉树的时候,存在直接前驱结点和后继结点的信息,对于非空指针域指向原本的左右孩子,而对于非空指针域来说,左孩子指针指向遍历序列的直接前驱结点,右孩子指向遍历序列的直接后继结点。
这种指针称为线索,加了线索的二叉树称为线索二叉树。

3.线索二叉树的结构

为每个结点增设两格标志域ltag和rtag,令:
当Itag=0:表示lchild指向结点的左孩子;ltag=1:表示lchild指向结点的前驱结点。
当rtag=0:表示rchild指向结点的右孩子;rtag=1:表示rchild指向结点的后继结点。

为了将二叉树的所有空指针域都利用上,并且方便判断遍历操作何时结束,在存储的时候增设一个头结点,该头结点和其他结点类型相同,值域不存储值,初始化使其左指针域指向二叉树的根结点,右指针域指向自己。线索化完成后,让头结点的值域指向按某种顺序 遍历下的最后一个结点。而原二叉树在某种遍历顺序下的第一个结点的前驱线索和最后一个结点的后继线索都指向。
【结构体的定义】

//线索二叉树结点的定义
typedef char ElemType;
typedef struct BiThrNode
{ElemType data;int ltag;int rtag;struct BiThrNode* lchild;struct BiThrNode* rchild;
}BiThrNode,*BiThrTree;

4. 线索二叉树的操作

4.1. 建立一棵中序线索二叉树

【算法实现】

//建立中序线索二叉树
void InThreading(BiThrTree p, BiThrTree* pre)//递归算法
{if (p){InThreading(p->lchild, pre);//左子树线索化//前驱线索if (!p->lchild){p->ltag = 1;p->lchild = *pre;}elsep->ltag = 0;//后继线索if (!(*pre)->rchild){(*pre)->rtag = 1;(*pre)->rchild = p;}else(*pre)->rtag = 0;*pre = p;InThreading(p->rchild, pre);//右子树的线索化}
}
int InOrderThr(BiThrTree* head, BiThrTree T)//带头结点的中序线索二叉树的算法
{//基于中序遍历二叉树T,并将中序线索化,*head指向头结点//申请头结点的空间BiThrTree pre;if (!(*head = (BiThrTree)malloc(sizeof(BiThrNode))))return 0;//建立头结点(*head)->ltag = 0;(*head)->rchild = *head;//右指针回针if (!T)(*head)->lchild = *head;//若二叉树为空,则左指针回针else{(*head)->lchild = T;pre = *head;InThreading(T, &pre);//中序遍历进行中序线索化pre->rchild = *head; pre->rtag = 1;//最后一个结点线索化(*head)->rtag = 1;(*head)->rchild = pre;}return 1;
}

4.2. 在中序线索二叉树上查找任意结点的中序前驱结点

存在两种情况:

  1. 如果该结点的左标志为1,那么其左指针域指向的结点就是它的前驱结点。
  2. 如果该结点的左标志为0,那么说明该结点存在左孩子。由中序序列的定义,该左孩子的右子树的最后一个结点就是该结点前驱结点。即沿着其左孩子右指针向下找,当某个结点的右标志域为1时,它就是该结点的前驱结点。

【算法实现】

//在中序线索二叉树上查找任意结点的中序前驱结点
BiThrTree InPreNode(BiThrTree p)
{//在中序线索二叉树上寻找结点p的中序前驱结点BiThrTree pre = p->lchild;if (p->ltag == 0)//有左子树,找左子树最右下方的结点{while (pre->rtag == 0)pre = pre->rchild;}return pre;
}

4.3. 在中序线索二叉树上查找任意结点的中序后继结点

  1. 如果该结点的右标志为1,那么其右指针域指向的结点就是它的后继结点。
  2. 如果该结点的右标志为0,那么说明该结点存在右孩子。由中序序列的定义,该右孩子的左子树的最后一个结点就是该结点后继结点。即沿着其右孩子左指针向下找,当某个结点的左标志域为1时,它就是该结点的后继结点。

【算法实现】

//在中序线索二叉树上查找任意结点的中序后继结点
BiThrTree InPostNode(BiThrTree p)
{//在中序线索二叉树上寻找结点p的中序后继结点BiThrTree post = p->rchild;if (post->rtag == 0)//有右子树,找右子树最左下方的结点{while (post->ltag == 0)post = post->lchild;}return post;
}

4.4. 在中序线索二叉树上查找任意结点在先序下的后继结点

(1)若 * p为分支结点,待确定的先序下的后继结点有两种情况
①当p->ltag=0时,* p的左孩子为 * p的先序下的后继结点。
②当p->ltag=1且 p->rtag=0时,* p 的右孩子为 * p先序下的后继结点
(2)若 * p为叶子结点:
如果 * p的后继结点存在,则说明 一定是 * p某个祖先的右孩子结点;不存在则指向头结点。
【算法实现】

//在中序线索二叉树上查找任意结点在先序下的后继结点
BiThrTree InPrePostNode(BiThrTree head, BiThrTree p)
{//在中序线索二叉树上寻找结点p的先序下的后继结点,head为头结点BiThrTree post;if (p->ltag == 0)post = p->lchild;//*p有左子树else{post = p;while (post->rtag == 1 && post->rchild != head)post = post->rchild;post = post->rchild;}return post;
}

4.5. 在中序线索二叉树上查找任意结点在后序下的前驱结点

两种情况:
①存在右孩子,则右孩子是后序下的前驱结点;存在左孩子但是不存在右孩子,则左孩子是后序的前驱结点。
②是叶子结点,则它的在后序下的前驱结点是其某个祖先的左孩子,或者不存在则是头结点。
【算法实现】

//在中序线索二叉树上查找任意结点在后序结点下的前驱结点
BiThrTree InPostPreNode(BiThrTree head, BiThrTree p)
{//在线索二叉树上寻找结点p的后序下的前驱结点,head为头结点BiThrTree pre;if (p->rtag == 0)pre = p->rchild;else{pre = p;while (pre->ltag == 1 && pre->lchild != head)pre = pre->lchild;pre = pre->lchild;}return pre;
}

4.6. 在中序线索二叉树上查找值为x的结点

先找打中序序列中的第一个结点,在依次往后遍历整个中序线索二叉树。
【算法实现】

//在中序线索二叉树上查找值为x的结点
BiThrTree Search(BiThrTree head, ElemType x)
{//以head的头结点的中序线索二叉树中查找值为x的结点BiThrTree p = head->lchild;while (p->ltag == 0 && p != head)p = p->lchild;//找到中序序列的第一个结点while (p != head && p->data != x)p = InPostNode(p);if (p == head){printf("Not Found the data!\n");return 0;}else return p;
}

4.7. 中序线索二叉树上的插入与删除

插入和删除一个结点,都需要重新进行线索化。在这里讨论,插入一个结点使其成为右孩子。
【算法实现】

//在中序线索二叉树上的插入与删除
void InsertThrRight(BiThrTree s, BiThrTree p)
{//在中序线索二叉树中插入结点p,使其称为结点s的右孩子BiThrTree w;//将s变为p的中序前驱p->rchild = s->rchild;p->rtag = s->rtag;p->lchild = s;p->ltag = 1;//p变成s的右孩子s->rchild = p;s->rtag = 0;//当前s原来的右子树不为空,找到s的后继w,将w变成p的后继,并将p变成w的前驱if(p->rtag==0){w = InPostNode(p);w->lchild = p;}
}

5. 基于中序线索二叉树的遍历算法

//基于中序线索二叉树的遍历算法
void ThInOrder(BiThrTree head)
{//在中序线索二叉树上进行中序遍历BiThrTree p = head->lchild;while (p->ltag == 0)p = p->lchild;//找第一个结点while (p != head)//依序找后继结点{printf("%c ", p->data);p = InPostNode(p);}
}
void ThpreInOrder(BiThrTree head)
{//在中序线索二叉树上进行前序遍历BiThrTree p = head->lchild;while (p != head)//依序找打后继结点{printf("%c ", p->data);p = InPrePostNode(head, p);}
}
void ThpostInOrder(BiThrTree head)
{//在中序线索二叉树上进行后序遍历的逆序BiThrTree p = head->lchild;while (p != head)//依序找到前驱结点{printf("%c ", p->data);p = InPostPreNode(head, p);}
}
http://www.15wanjia.com/news/188944.html

相关文章:

  • 做网站的软件叫什么软件谷歌优化推广
  • 石家庄外贸网站建设公司排名做直播网站需要证书吗
  • 深圳做网站 创同盟淘宝上网站开发
  • 柳州网站建设价格亚马逊店铺网站建设费用
  • 个人网站建设模板简洁图片站群网站和做seo那个号
  • 设计网站推荐视频会员视频网站建设
  • 服装网站怎么做的中文绿色环保网站模板
  • 南京专业制作网站淘宝导购网站源码
  • 网站开发使用软件环境硬件环境微信官网登录
  • 做名片模板网站做网站前期框架图
  • 做推广可以上那些网站网站的微信推广怎么做
  • 普陀网站开发培训学校网站开发风险分析
  • 网站源码小千个人网品牌营销全案策划
  • 百度网站提交入口贵阳设计工作室
  • 搭建网站案例精粹wordpress后台使用
  • 帮做网站的公司软件开发流程流程图
  • png素材网站it外包人员最后什么下场
  • 中国建设银行网站首页u盾登入网站建设与网页设计专业的
  • 医疗生物科技 网站建设营销网站建设方案
  • 网站页尾设计做网站会不会亏本
  • 温州微网站制作公司电话《动画造型设计》
  • 合肥网络seo广州网络seo公司
  • 合肥网站排名提升企业网络营销策略有哪些
  • 网站建设期末题答案wordpress更改语言设置
  • 建设工程施工安全网站百度小说网
  • 做电池网站的引导页开发区实验小学
  • 网站开发记科目在新加坡注册公司需要什么条件
  • 廊坊营销型网站建设零下一度网站建设
  • 百石网怎么做网站微信网站开发与网站实质区别
  • 米思米网站订单取消怎么做wordpress如何搭建在局域网