二叉树的线索化及其前驱后继查找

一 实质

遍历二叉树过程中用线索(前驱和后继)取代空指针的的做法

二 算法分析(给出中序化):

主要是增加俩个指针,pre指针始终指向刚刚访问过的节点,p指针始终指向当前访问的节点其中,*pre是*p的前驱,*p是*pre的后继

三 中序线索化算法:

[cpp] view plain copy

 

  1. //将二叉树按中序线索化算法  
  2. typedef enum   {Link,Thread} PointerTag;//枚举值分别为0,1  
  3. typedef struct node  
  4. {  
  5.     DataType data;  
  6.     PointerTag ltag,rtag;   //左右标志  
  7.     struct node *lchild ,*rchild;  
  8. }BinThrNode;//线索二叉树节点类型  
  9. typedef BinThrNode *BinThrTree;  
  10. void InorderThreading(BinThrTree p)  
  11. {//将二叉树p中序线索化  
  12.     if(p)//p非空时,当前访问结点是*p  
  13.     {  
  14.         InorderThreading(p->lchild);//左子树线索化  
  15.         //建立正在访问节点的前驱结点之间的线索  
  16.         t->ltag = (t->lchild)?Link:Thread;  
  17.         t->rtag = (t->rchild)?Link:Thread;  
  18.         if(pre)  
  19.         {  
  20.             if(pre->rtag==Thread)  
  21.                 pre->rchild = p;  
  22.             if(p->ltag==Thread)  
  23.                 p->lchid = pre;  
  24.         }  
  25.         pre = p;  
  26.         InorderThreading(t->rchild);//右子树线索化  
  27.     }  
  28. }  

算法分析:和中序遍历一样递归过程对每个节点仅做一次访问,因此对于n个节点的二叉树算法复杂度为O(n)

四 前驱和后继的查找

[cpp] view plain copy

 

  1. BinThrNode *InorderSuccessor(BinThrNode *p)  
  2. {//在中序线索树查找*p的后继  
  3.     BinThrNode *q;  
  4.     if(p->rtag==Thread)  
  5.         return p->rchlid;//返回其所指的后继  
  6.     else  
  7.     {  
  8.         q = p->rchild;//从*p的右孩子开始查找  
  9.         while(q->ltag==Link)  
  10.             q = q->lchild;//左子树为空,沿左链往下查找  
  11.         return q;  
  12.     }  
  13. }  
  14.  BinThrNode *Inorderpre(BinThrNode *p)  
  15.       {//在中序线索树中找结点*p的中序前趋,设p非空  
  16.          BinThrNode *q;  
  17.         if (p->ltag==Thread) //*p的左子树为空  
  18.                return p->lchild; //返回左线索所指的中序前趋  
  19.          else{  
  20.                q=p->lchild; //从*p的左孩子开始查找  
  21.                while (q->rtag==Link)  
  22.                     q=q->rchild; //右子树为空时,沿右链往下查找  
  23.                return q; //当q的右子树为空时,它就是最右下结点  
  24.              } //end if  
  25.       }  

从上面可以看出,对与非线索二叉树,查找其节点十分困难需要遍历,而线索二叉树加入了前驱和后继之后是这种查找变得简单易行

转载:http://blog.csdn.net/xsf50717/article/details/40106441

时间: 2025-01-30 18:00:05

二叉树的线索化及其前驱后继查找的相关文章

二叉树的层序遍历和二叉树的线索化

先根,后子树:先左子树,后右子树 二叉树的根节点 a 入队 a 的子树,根节点 b 和 c 分别入队 然后 b 的子树的根节点入队(为空) c 的子树的根节点入队 d 的子树的根节点入队(为空) e 的子树的根节点入队 f 的子树的根节点入队(为空) g的子树的根节点入队(为空)结束层序遍历,整个过程就是一层层的遍历,依靠一个队列来存放临时查找的结点.   二叉树线索化 问题的提出:当以二叉链表作为存储结构时,只能找到结点的左右孩子的信息,而不能直接找到结点的任一序列的前驱与后继信息,这种信息只

一步一步写算法(之排序二叉树线索化)

原文:一步一步写算法(之排序二叉树线索化) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com]     前面我们谈到了排序二叉树,还没有熟悉的同学可以看一下这个,二叉树基本操作.二叉树插入.二叉树删除1.删除2.删除3.但是排序二叉树也不是没有缺点,比如说,如果我们想在排序二叉树中删除一段数据的节点怎么办呢?按照现在的结构,我们只能一个一个数据查找验证,首先看看在不在排序二叉树中,如果在那么删除:如果没有这个数据,那么继续查找.那么有没有方法

二叉树中序线索化算法

// // 二叉树线索化的头文件:BinaryThreadTree.h #ifndef B_T_T_H #define B_T_T_H #include <stdio.h> // // 返回OK表示正常返回 #define OK 1 // // 返回ERROR,表示异常返回 #define ERROR 0 // // 返回OVERFLOW,表示内存溢出 #define OVERFLOW -1 // // 线索结构体 typedef enum { Link = 0, // 指针 Thread =

线索二叉树的线索话和前序遍历,使用C++的实现,数据结构大试题,谢谢

问题描述 线索二叉树的线索话和前序遍历,使用C++的实现,数据结构大试题,谢谢 线索二叉树的线索话和前序遍历,使用C++的实现,数据结构大试题,谢谢 解决方案 http://blog.csdn.net/shifuwawa/article/details/4647727 解决方案二: http://blog.csdn.net/algorithm_only/article/details/6991254

c语言基础-数据结构C语言版二叉树的问题。

问题描述 数据结构C语言版二叉树的问题. strong text #include "stdio.h" #include "malloc.h" #include "stdlib.h" #include "conio.h" #define stacksize 100 #define DataType char //便于后期修改.可以直接去修改char 类型来达到快速的修改,在程序长的情况下. typedef struct nod

数据结构的C++实现之线索二叉树

我们知道满二叉树只是一种特殊的二叉树,大部分二叉树的结点都是不完全存在左右孩子的,即很多指针域没有被充分 地利用.另一方面我们在对一棵二叉树做某种次序遍历的时候,得到一串字符序列,遍历过后,我们可以知道结点之间的前 驱后继关系,也就是说,我们可以很清楚地知道任意一个结点,它的前驱和后继是哪一个.可是这是建立在已经遍历过的基 础之上的.在二叉链表上,我们只能知道每个结点指向其左右孩子结点的地址,而不知道某个结点的前驱是谁,后继是谁. 要想知道,必须遍历一次.以后每次需要知道时,都必须遍历一次.为什

大话数据结构十五:线索二叉树

1. 什么是线索二叉树? n个结点的二叉链表中含有(2n-(n-1)=n+1个空指针域.利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针 (这种附加的指针称为"线索").这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树. 2. 为什么要加线索? ① 很多空指针域没有存储任何事物,对内存资源是一种浪费. ② 二叉链表中,我们只能知道每个结点指向其左右孩子结点的地址,却不知道每个结点的前驱是谁,后继是谁. ③ 线索链表解决了无法直接找到该结点在某

线索二叉树算法

#include <stdio.h>#include <malloc.h>#include<stdlib.h>typedef char DataType;/*定义DataType类型*/typedef enum {Link,Thread}PointerTag;typedef struct node{ DataType data; struct node *lchild, *rchild;/*左右孩子子树*/ PointerTag LTag,RTag;}BiThrNode

PHP实现二叉树/线索二叉树

PHP实现二叉树.线索二叉树,如下代码: <?php      require 'biTree.php';        $str = 'ko#be8#tr####acy#####';           $tree = new BiTree($str);      $tree->createThreadTree();        echo $tree->threadList() . "\n";从第一个结点开始遍历线索二叉树      echo $tree->