二叉树的遍历和线索线索二叉树

来源:互联网 发布:北京行知实践园作文 编辑:程序博客网 时间:2024/05/18 15:27


一、二叉树的遍历

1.先序遍历
在二叉树非空的情况下:
(1)访问根结点
(2)先序遍历左子树
(3)先序遍历右子树
对应算法如下:
void PreOrder(BiTree T){
  if(T != NULL){
    visit(T);//访问根结点
    PreOrder(T->lchild);//遍历右子树
    PreOrder(T->rchild);//遍历左子树
  } 
}
2.中序遍历
(1)中序遍历左子树
(2)访问根结点
(3)中序遍历右子树
对应算法如下:
void InOrder(BiTree T){
  if(T != NULL){
    InOrder(T->lchild);
    visit(T);
    PreOrder(T->rchild);
  }

3.后序遍历过程为:
(1)中序遍历左子树
(2)中序遍历右子树
(3)访问根结点
对应算法如下:
void PostOrder(BiTree T){
  if(T != NULL){
    InOrder(T->lchild);
    PreOrder(T->rchild);
    visit(T);
  }

4.由遍历序列构造二叉树
根据先序序列和中序序列可唯一确定一棵二叉树
根据后序序列和中序序列也可以确定一棵二叉树
但是后序和先序序列无法唯一确定一棵二叉树

二、线索二叉树
1.基本概念
若无左子树,令lchild指向前驱结点,若无右子树,令rchild指向后继结点。前继和后继根据遍历序列方式而不同
线索二叉树存储结构描述:
typedef struct _node_{
  int data;//数据
  struct _node_ *lchild, *rchild;//左右孩子指针
  int ltag,rtag;//左右线索标志
}Node;
2.线索二叉树构造
通过中序遍历对二叉树线索化算法:
void InThred(ThreadTree &p,ThreadTrdd &pre){  if(p != NULL){    InThread(p->lchild, pre);//递归,线索化左子树    if(p->lchild == NULL){   //左子树为空,建立前戏线索      p->lchild = pre;      p->ltag = 1;    }    if(pre != NULL && pre->rchild == NULL){      pre->rchild = p;  //建立前驱结点的后继线索      pre->rtag = 1;    }    pre = p;  //标记当前结点成为刚刚访问过的结点    InThred(p->rchild, pre); //递归线索化右子树  }}
主算法如下:
void CreateInThread(ThreadTree T){  ThreadTree pre = NULL;  if(T != NULL){    InThread(T, pre);    pre->rchild = NULL;//处理遍历的最后一个结点    pre->rtag = 1;  }}
3.线索二叉树的遍历
(1)找中序二叉树中中序序列下的第一个结点
  ThreadNode *Firstnode(ThreadNode *p){
    while(p->ltag == 0) p = p->lchild;
    return p;
  }
(2)找中序序列二叉树结点p在中序序列下的后继结点
  ThreadNode *Nextnode(ThreadNode *p){
    if(p->rtag == 0)return Firstnode(p->p->rchild);
    else return p->rchild; 
  }
(3)利用以上两个算法,写出中序线索二叉树的中序遍历算法
  void Inorder(ThreadNode *T){
    for(ThradNode *p=Firstnode(T); p!=NULL; p=Nextnode(p))
      visit(p);
}











原创粉丝点击