C语言 二叉树相关

来源:互联网 发布:好玩的桌面软件 编辑:程序博客网 时间:2024/06/07 01:23
#include<stdio.h>
#include<stdlib.h>

//定义节点
typedef int data_t;
typedef struct tree_node
{
   data_t data;
   struct tree_node *lchild;
   struct tree_node *rchild;
}btree_t;

//初始化
btree_t *init_btree(int num,int max)
{
   btree_t * root;
   if(num > max)
         return NULL;
   root = malloc(sizeof(btree_t));
   root->data = num;
   root->lchild =  init_btree(2*num,max);
   root->rchild = init_btree(2*num + 1,max);
   return root;
}

//层序遍历
void level_btree(btree_t *root)
{
    btree_t *queue[100] = {0};
    int front,rear;
    front = rear = 0;
   queue[rear++] = root;
   while(front < rear)
   {
    if(NULL != queue[front]->lchild)
        queue[rear++] = queue[front]->lchild;
   if(NULL != queue[front]->rchild)
        queue[rear++] = queue[front]->rchild;
      printf(" %d ",queue[front]->data);
      front++;
   }
    printf(":end\n");
   return;
}

//先序遍历
void DLR(btree_t *root)
{
  if(NULL == root)
          return;
  printf(" %d ",root->data);
  DLR(root->lchild);
  DLR(root->rchild);
  return;
}

//中序遍历
void LDR(btree_t *root)
{
   if(NULL == root)
        return;
   LDR(root->lchild);
   printf(" %d ",root->data);
   LDR(root->rchild);
   return;
}

//后序遍历
void LRD(btree_t *root)
{
   if(NULL == root)
        return;
   LRD(root->lchild);
   LRD(root->rchild);
   return;
}

//使用队列先序遍历
void stack_dlr(btree_t *root)
{
   btree_t *stack[20];
   int top = -1;
   printf(" stack_dlr:");
   while(top != -1 || NULL != root)
   {
       while(NULL != root)
     {
       printf(" %d ",root->data);
      stack[++top] = root;
      root = root->lchild;
     }
          root = stack[top--]->rchild;
   }
   printf("\n");
   return;
}

//使用队列中序遍历
void stack_ldr(btree_t *root)
{
    btree_t *stack[20];
    int top = -1;
    printf("stack_ldr:");
while(top != -1 || NULL != root)
{
        while(NULL != root)
{
   stack[++top] = root;
   root = root->lchild;
}
    printf(" %d ",stack[top]->data);
     root = stack[top--]->rchild;
}
    printf("\n");
    return;
}

//使用队列后序遍历
void stack_lrd(btree_t *root)
{
    struct {
    btree_t *root;
    int cp;
}stack[20];
i   nt top = -1;
    printf("stack_lrd:");
while(NULL != root || -1 != top)
{
  while(NULL != root)
  {
     stack[++top].root = root;
    stack[top].cp = 1;
    root = root->lchild;
  }
  if(1 == stack[top].cp)
  {
      root = stack[top].root->rchild;
     stack[top].cp = 2;
     continue;
  }
  printf(" %d ",stack[top--].root->data);
}
printf("\n");
return ;
}

//测试

int main(int argc, const char *argv[])
{
    btree_t *root = init_btree(1,6);
    level_btree(root);
    LDR(root);
    LRD(root);
    DLR(root);
    printf("\n*********前序遍历*******************\n");
    stack_dlr(root);
    printf("**********************************\n");
    printf("\n*********中序遍历*******************\n");
    stack_ldr(root);
    printf("**********************************\n");
    printf("\n*********后序遍历*******************\n");
    stack_lrd(root);
    printf("**********************************\n");
return 0;
}



0 0
原创粉丝点击