回 帖 发 新 帖 刷新版面

主题:重发二叉树的各种算法(顶的加分)

包括了各种遍历,搜索路径,交换子树,求树的深度,叶子树
还有线索二叉树的生成。用相对符合课本的形式写的。
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAX 100
#define MAXSIZE 100
typedef int Status;
typedef char ElemType;
typedef struct BitNode/* 定义二叉树机构 */
{
  ElemType data;
  struct BitNode *lchild,*rchild;
}BitNode,*BiTree;
typedef struct Queue/* 定义队列 */
{
   BiTree *base;
   int front,rear;
}Queue;
Status InitQueue(Queue *Q)/* 初始化队列 */
{
  Q->base=(BiTree *)malloc(MAXSIZE*sizeof(BiTree));
  if(!Q->base) return ERROR;
  Q->front=Q->rear=0;
  return OK;
}
Status QueueEmpty(Queue *Q)/* 队列判空 */
{
  if(Q->front==Q->rear) return 1;
  return 0;
}
Status EnQueue(Queue *Q,BiTree e)/* 入队 */
{
   if((Q->rear+1)%MAXSIZE==Q->front) return ERROR;
   Q->base[Q->rear]=e;
   Q->rear=(Q->rear+1)%MAXSIZE;
   return OK;
}
Status DeQueue(Queue *Q,BiTree *e)/* 出队 */
{
  if(Q->rear==Q->front) return ERROR;
  (*e)=Q->base[Q->front];
  Q->front=(Q->front+1)%MAXSIZE;
  return OK;
}

Status PrintElement(ElemType e)/* 最简单的Visit函数 */
{
  printf("%c",e);
  return OK;
}
Status CreateBiTree(BiTree *T)/* 创建二叉树 */
{
  ElemType ch;
  scanf("%c",&ch);
  if(ch==' ') (*T)=NULL;
  else
  {
    if(!((*T)=(BitNode *)malloc(sizeof(BitNode)))) exit (OVERFLOW);
    (*T)->data=ch;
    (*T)->lchild=(*T)->rchild=NULL;
    CreateBiTree(&((*T)->lchild));
    CreateBiTree(&((*T)->rchild));
  }
return OK;
}
Status PreOrderTraverse(BiTree T,Status(*Visit)(ElemType e))/* 先序遍历 */
{
    if(T)
    {
        if(!Visit(T->data)) exit(ERROR);
        PreOrderTraverse(T->lchild,Visit);
        PreOrderTraverse(T->rchild,Visit);
    }
    return OK;
}
Status InOrderTraverse(BiTree T,Status(*Visit)(ElemType e))/* 中序遍历 */
{
if(T)
{
   InOrderTraverse(T->lchild,Visit);
   if(!Visit(T->data)) exit(ERROR);
   InOrderTraverse(T->rchild,Visit);
}
return OK;
}
Status PostOrderTraverse(BiTree T,Status(*Visit)(ElemType e))/* 后序遍历 */
{
  if(T)
  {
    PostOrderTraverse(T->lchild,Visit);
    PostOrderTraverse(T->rchild,Visit);
    if(!Visit(T->data)) exit(ERROR);
  }
  return OK;
}
Status PreOrderTraverse_None_Recursion(BiTree T,Status(*Visit)(ElemType e))/* 先序非递归 */
{   
    BiTree p=T,Stack[MAX];
    int top=0;
    while (p|| top>0)
    {
        while (p)           
        {
            if(!Visit(p->data)) exit(ERROR);
            Stack[top++]=p;
            p=p->lchild;       
        }     
        if (top>0)        
        {
            p=Stack[--top];
            p=p->rchild;        
       }               
    }
    return OK;
}

回复列表 (共18个回复)

11 楼

Thank you.

12 楼

个人认为:如果再把注释写得详细点的话,就近呼完美了

13 楼

怎么老是用结构呢,用类呀。

14 楼

顶下

15 楼

挖~~~楼住厉害

16 楼

DING

17 楼

我顶!!!

18 楼

很好很好,再把程序过程解释详细一点就更棒了

我来回复

您尚未登录,请登录后再回复。点此登录或注册