C/C++建树和遍历

本文介绍如何使用C/C++语言创建二叉树,并分别进行前序、中序和后序遍历。通过示例代码展示树节点的定义、插入新节点以及三种遍历方式的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. /*c/c++建树和遍历*/
  2. #include <stdio.h>
  3. #include <malloc.h>
  4. typedef struct node{ 
  5. int data; 
  6. struct node *lchild,*rchild; 
  7. }*treetp,tree; 
  8. treetp create (treetp t,int c); 
  9. void print1(treetp); 
  10. void print2(treetp);
  11. void print3(treetp);
  12. int number=0;
  13. void main() 
  14. {
  15.   treetp t=0,r; 
  16.   r=create (t,0); 
  17.   printf("前序排列 :");
  18.   print1  (r); 
  19.   printf("/n中序排列 :");
  20.   print2 (r);
  21.   printf("/n后序排列 :");
  22.   print3 (r);
  23. treetp  create(treetp t,int c) 
  24. treetp p,di; 
  25. do
  26. scanf("%d",&c); 
  27. if (t==0) 
  28.  { 
  29.  t=(treetp)malloc(sizeof(tree)); 
  30.  t->lchild=t->rchild=0; 
  31.  t->data=c; 
  32.  } 
  33. else 
  34.  {   p=t; 
  35.   while(p!=0) 
  36.   { 
  37.   di=p; 
  38.   if(c<(p->data)) 
  39.   p=p->lchild; 
  40.   else 
  41.   p=p->rchild; 
  42.   } 
  43. if(c<(di->data)) 
  44. treetp NEWdi=(treetp) malloc(sizeof(tree)); 
  45. NEWdi->lchild=NEWdi->rchild=0; 
  46. NEWdi->data=c; 
  47. di->lchild=NEWdi; 
  48. else 
  49. treetp NEWdi=(treetp) malloc(sizeof(tree)); 
  50. NEWdi->lchild=NEWdi->rchild=0; 
  51. NEWdi->data=c; 
  52. di->rchild=NEWdi; 
  53.  } 
  54. ++number;
  55. }while(c!=0); 
  56. printf("叶子的数量:%d",number);
  57. return t;
  58. }   
  59. void print1(treetp  t) 
  60.    if (t!=0) 
  61.   {     
  62.    printf("%d ",t->data);
  63.    print1(t->lchild); 
  64.    print1(t->rchild); 
  65.    } 
  66. void print2(treetp  t) 
  67.    if (t!=0) 
  68.   {     
  69.    print2(t->lchild); 
  70.    printf("%d ",t->data); 
  71.    print2(t->rchild); 
  72.    } 
  73. void print3(treetp  t) 
  74.    if (t!=0) 
  75.   {     
  76.    print3(t->lchild);  
  77.    print3(t->rchild); 
  78.    printf("%d ",t->data);
  79.    } 

<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
您好!您可以使用后序遍历中序遍历来构建一棵二叉树。下面是一个示例代码,可以帮助您理解: ```c #include <stdio.h> #include <stdlib.h> // 二叉树的结点定义 struct Node { int data; struct Node* left; struct Node* right; }; // 根据后序遍历数组中序遍历数组构建二叉树 struct Node* buildTree(int inOrder[], int postOrder[], int inStart, int inEnd, int* postIndex) { // 如果中序遍历的起始位置大于结束位置,表示没有结点可以构建 if (inStart > inEnd) { return NULL; } // 创建新的结点,并将当前后序遍历的元素赋值给它 struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = postOrder[*postIndex]; (*postIndex)--; // 如果中序遍历的起始位置等于结束位置,表示已经到达叶子结点 if (inStart == inEnd) { newNode->left = NULL; newNode->right = NULL; return newNode; } // 在中序遍历数组中找到当前结点的位置 int inIndex; for (int i = inStart; i <= inEnd; i++) { if (inOrder[i] == newNode->data) { inIndex = i; break; } } // 根据当前结点的位置,递归构建左右子树 newNode->right = buildTree(inOrder, postOrder, inIndex + 1, inEnd, postIndex); newNode->left = buildTree(inOrder, postOrder, inStart, inIndex - 1, postIndex); return newNode; } // 后序遍历二叉树 void postOrderTraversal(struct Node* root) { if (root == NULL) { return; } postOrderTraversal(root->left); postOrderTraversal(root->right); printf("%d ", root->data); } int main() { int inOrder[] = {4, 8, 2, 5, 1, 6, 3, 7}; int postOrder[] = {8, 4, 5, 2, 6, 7, 3, 1}; int size = sizeof(inOrder) / sizeof(inOrder[0]); int postIndex = size - 1; struct Node* root = buildTree(inOrder, postOrder, 0, size - 1, &postIndex); printf("后序遍历结果为:"); postOrderTraversal(root); return 0; } ``` 这段代码会根据中序遍历数组后序遍历数组构建一棵二叉树,并进行后序遍历输出。您可以根据自己的需求修改中序遍历数组后序遍历数组,来构建相应的二叉树。希望能够帮到您!如有需要,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值