数据结结构学习 -- 2叉树

------ 二叉树的顺序存储表示 ------

#define MAX_TREE_SIZE 100;

typedef TElemType SqBiTree[MAX_TREE_SIZE];

SqBiTree bt;

------ 二叉树的 二叉链表存储表示 ------

typedef struct BiTNode {

  TElemType data;

  struct BiTNode * lchild, *rchild;

}BiTNode,BiTree;

 

遍历2叉树  L,D,R (左子树,根,右子树)  先根遍历,中根遍历,后根遍历。

 

status PreOderTraverse(BiTree t, status (* visit)(TElemType e)) {

  if (t) {

    visit (t->data)

    if (PreOderTraverse(t->lchild,visit) )

      if (PreOderTraverse(t->rchild,visit)) return ok;

    return ERROR;

  }else return ok;

}

中序遍历二叉树非递归方法

status InOrderTraverse(BiTree t, status (*visit)(TElemType e) ) {

  InitStack(s) ;  push( s,T); // 根进栈

  while( !StatckEmpty(s)) {

    while ( GetTop(s,p) && p )  push(s,p->lchild); //向左走到尽头

    pop(s,p); //空指针退栈

    if(!StackEmpty(s)) {

      pos(s,p);  if(!visit(p->data)) return ERROR;

      push(s,p->rchild);

    } // if

  } //while

  return ok;

}

status InOrderTraverse(BiTree t, status (*visit)(TElemType e) ) {

  InitStack(s); p=T;

  while(p || !StackEmpty(s,p) ) {

    if(p) push(s,p->lchild); //根指针近栈,遍历左子树

    else {

      pop(s,p);  if(!visit(p->data)) return ERROR;

      p = p->rchild;

    } //else

  } //while

  return OK;

}

 status CreateBiTree( BiTree & t) {

  scanf(&ch);

  if ( ch == '') t= NULL;

  else {

    if(!(t= (BiTNode*) malloc (sizeof(BiTNode) ) ) ) exit;

    t->data = ch;

    CreateBiTree(t->lchild);

    CreateBiTree(t->rchild);

  }//else

}

------ 二叉树的 二叉线索存储表示 ------

typedef enum PointerTag { Link , Thread } ;

typedef struct BiThrNode {

  TElemType data;

  struct BiThrNode * lchild ,rchild;

  PointerTag LTag,RTag;

} BiThrNode,*BiThrTree;

 

status InOrderTraverse_Thr(BiThrTree t, status (*visit)(TElemType e) ) {

  p = T->lchild; //p 指向根节点

  while(p!=t) { //空树或遍历结束时,P==t

    while(p->LTag = Link) p = p->lchild;  //

    if (!viist (p->data) return ERROR;

    while( (p->RTag == Thread) && p->rchild!=t) {

      p = p->rchild; visit(p->data);

    }//while

    p = p->rchild;

  }//while

  return OK;

}

中序遍历二叉树并线索化链表

status InOrderThreading(BiThrTree & thr,BiThrTree t) {

  if (! ( thrt= (BiThrTree) malloc ( sizeof(BiThrTree) ) ) ) exit;

  thrt->LTag = link; thrt->RTag = thread;  //建立头结点

  thrt->rchild = thrt;  //右指针回指

  if (!t) thrt->lchild = thrt; //若二叉树为空,则左指针回指

  else {

    thrt->lchild = t ;  pre= thrt;

    InThreading(t); //中序遍历进行中序线索化

    pre->rchild = thrt;  pre->RTag = Thread; //最后一个节点线索化

    thrt->rchild = pre;

  } //else

  return ok;

}

void InThreading(BiThrTree p) {

  if (p) {

    InThreading(p->lchild);  //左子树线索化

    if(!p->lchild) { p->LTag = Thread;  p->lchild = pre; } //前驱线索

    if(!pre->rchild) { pre->RTag = Thread; pre->rchild = p; } // 后续线索

    pre = p;

    InThreading(p->rchild);

  } //if

}

 

posted on 2012-11-24 11:39  莫水千流  阅读(297)  评论(0编辑  收藏  举报