树结构的动态建立和前序、中序、后序遍历

本文介绍了一种使用结构指针动态构建二叉搜索树的方法,并提供了输入数据、创建树及三种遍历方式(前序、中序、后序)的具体实现。

 /**
*  StructTreePoint.c
*  version 1.0 2006-9-18
*  write by  jsp
*  用结构指针来动态建立树结构
*/

#include"stdio.h"
#include"stdlib.h"

int count = 0;

//输入数据
int *input(int *inputData)
{
 int *pc;
 int data;

 pc = (int *)malloc(sizeof(int));

 do
 {
  if(pc == NULL)
  {
   printf("CREAT FAIL!!/n");
   if(count == 0)
    return NULL;
   else
    return inputData;
  }

  scanf("%d",&data);
  if(data != 0)
  {
   *pc = data;
   if(count == 0)
    inputData = pc;
   count ++;
   pc++;
  }
 }while(data != 0);
 return  inputData;
}


struct LpTree
{
 struct LpTree * left;
 struct LpTree * right;
 int data;
};

//前序遍历
void  preOrder(struct LpTree *pTreeC)
{
 if(pTreeC != NULL );
 {
  printf("%d/n",pTreeC->data);
  if(pTreeC->left != NULL)
   preOrder(pTreeC->left);
  if(pTreeC->right != NULL)
   preOrder(pTreeC->right);
 }
}

//中序遍历
void  midOrder(struct LpTree *pTreeC)
{
 if(pTreeC != NULL );
 {
  if(pTreeC->left != NULL)
   midOrder(pTreeC->left);
  printf("%d/n",pTreeC->data);
  if(pTreeC->right != NULL)
   midOrder(pTreeC->right);
 }
}

//后序遍历
void  bakOrder(struct LpTree *pTreeC)
{
 if(pTreeC != NULL );
 {
  if(pTreeC->left != NULL)
   bakOrder(pTreeC->left);
  if(pTreeC->right != NULL)
   bakOrder(pTreeC->right);
  printf("%d/n",pTreeC->data);

 }
}

struct LpTree *creat(struct LpTree *pTree,int *inD)
{
 struct LpTree * pc, *pf;
 int i;
 pc = (struct LpTree *)malloc(sizeof(struct LpTree));

 if(pc == NULL)
 {
  return NULL;
 }
 pc ->data  = *inD;
 pc ->left  = NULL;
 pc ->right = NULL;
 pTree = pc;
 pc = NULL;

 for(i = 1 ; i < count; i++)
 {
  pf = pTree;
  inD++;
  pc = (struct LpTree *)malloc(sizeof(struct LpTree));
  pc ->data = *inD;
     pc ->left = NULL;
     pc->right = NULL;
  while(pf != NULL)
  {
   if(pc->data < pf->data)//判断是否是左子树
   {
    if(pf->left == NULL)
    {
     pf->left = pc;
     break;
    }
    else
    {
     pf = pf->left;
    }
   }
   else
   {
    if(pf->right == NULL)//判断是否是右子树
    {
     pf->right=pc;
     break;
    }
    else
    {
     pf=pf->right;
    }
   }
  }
 }
 return pTree;
}

void main()
{
 int *inputData = NULL;
 int *inputDataC;
 struct LpTree *pTree = NULL;
 struct LpTree *pTreeC;
 int  i;//循环变量
 
 inputData = input(inputData);//输入数据
 inputDataC = inputData;

 //  打印输入的数据出和相对应的地址
 for(i = 0 ; i < count ; i++)
 {
  printf("%d--%d/n",inputDataC,*inputDataC);
  inputDataC++;
 }
 inputDataC = inputData;
 pTree = creat(pTree,inputDataC);

 pTreeC=pTree->left;
 printf("打印出左子树木:/n");
 while(pTreeC != NULL)
 {
  printf("%d--%d/n",pTreeC,pTreeC->data);
  pTreeC=pTreeC->left;
 }

 pTreeC=pTree->right;
 printf("打印出右子树木:/n");
 while(pTreeC != NULL)
 {
  printf("%d--%d/n",pTreeC,pTreeC->data);
  pTreeC=pTreeC->right;
 }

  printf("前序遍历:/n");
  pTreeC=pTree;
  preOrder(pTreeC);

  printf("中序遍历:/n");
  pTreeC=pTree;
  midOrder(pTreeC);

  printf("后序遍历:/n");
  pTreeC=pTree;
  bakOrder(pTreeC);
}

树是一种常用的数据结构,具有分层的特点。在树的结构中,常常需要对树进行遍历操作,包括前序遍历、中遍历后序遍历层次遍历前序遍历(Preorder Traversal)是指先遍历根节点,再遍历左子树,最后遍历右子树。可以通过递归或者栈的方式实现前序遍历。 中遍历(Inorder Traversal)是指先遍历左子树,再遍历根节点,最后遍历右子树。同样可以通过递归或者栈的方式实现中遍历后序遍历(Postorder Traversal)是指先遍历左子树,再遍历右子树,最后遍历根节点。同样可以通过递归或者栈的方式实现后序遍历。 层次遍历(Level Order Traversal)是指从上到下逐层遍历树的节点。可以利用队列的方式实现层次遍历,先将根节点入队,然后依次将每个节点的左右子节点入队,直到队列为空。 在C语言中,可以利用结构体指针表示树的节点,通过递归或者迭代的方式实现树的遍历操作。可以使用数组、链表或者队列等数据结构来辅助实现。 以下是一段C语言代码示例,演示了如何实现树的前序、中后序层次遍历操作: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 前序遍历 void preorderTraversal(TreeNode* root) { if (root == NULL) return; printf("%d ", root->data); preorderTraversal(root->left); preorderTraversal(root->right); } // 中遍历 void inorderTraversal(TreeNode* root) { if (root == NULL) return; inorderTraversal(root->left); printf("%d ", root->data); inorderTraversal(root->right); } // 后序遍历 void postorderTraversal(TreeNode* root) { if (root == NULL) return; postorderTraversal(root->left); postorderTraversal(root->right); printf("%d ", root->data); } // 层次遍历 void levelOrderTraversal(TreeNode* root) { if (root == NULL) return; TreeNode* queue[100]; // 使用数组模拟队列 int front = 0; int rear = 0; queue[rear++] = root; while (front < rear) { TreeNode* node = queue[front++]; printf("%d ", node->data); if (node->left != NULL) { queue[rear++] = node->left; } if (node->right != NULL) { queue[rear++] = node->right; } } } int main() { // 创建一棵树 TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->data = 1; root->left = (TreeNode*)malloc(sizeof(TreeNode)); root->right = (TreeNode*)malloc(sizeof(TreeNode)); root->left->data = 2; root->right->data = 3; root->left->left = NULL; root->left->right = NULL; root->right->left = NULL; root->right->right = NULL; printf("前序遍历结果:"); preorderTraversal(root); printf("\n中遍历结果:"); inorderTraversal(root); printf("\n后序遍历结果:"); postorderTraversal(root); printf("\n层次遍历结果:"); levelOrderTraversal(root); return 0; } ``` 以上代码中,先定义了树的结构体`TreeNode`,包含数据、左子树指针右子树指针。然后定义了四个遍历函数,根据不同的遍历方式实现相应的遍历过程。在`main`函数中,创建了一棵树,并调用四个遍历函数分别进行遍历操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值