二叉树的递归遍历:先序、中序、后序

需积分: 9 0 下载量 175 浏览量 更新于2024-09-10 收藏 878B TXT 举报
"二叉树的创建与先序、中序、后序遍历的递归实现" 在计算机科学中,二叉树是一种常见的数据结构,用于存储具有层级关系的数据。这个程序是关于如何用C语言创建一个二叉树以及进行先序、中序和后序遍历的递归实现。以下是对这些概念的详细解释: 1. 二叉树结构:二叉树由节点(bitnode)组成,每个节点包含一个数据元素(char data)和两个指向子节点的指针(struct bitnode *lchild, *rchild)。根节点没有父节点,而叶子节点没有子节点。非叶子节点可以有零个、一个或两个子节点。 2. 二叉树的创建:`creatree(bitree *t)` 函数用于创建二叉树。用户输入字符,如果输入的是'.',表示创建空节点(NULL),否则创建一个新节点,将字符存储在数据字段,并递归地为左子节点和右子节点调用 `creatree()`。 3. 先序遍历:在先序遍历中,首先访问根节点,然后遍历左子树,最后遍历右子树。`void pre(bitree t)` 函数实现了这个顺序。它首先打印当前节点的值,然后递归地对左子树进行先序遍历,再对右子树进行先序遍历。 4. 中序遍历:在中序遍历中,首先遍历左子树,然后访问根节点,最后遍历右子树。`void in(bitree t)` 函数按照这个顺序执行。它先对左子树进行中序遍历,然后打印当前节点的值,最后对右子树进行中序遍历。 5. 后序遍历:后序遍历的顺序是先遍历左子树,然后遍历右子树,最后访问根节点。`void post(bitree t)` 函数遵循这个规则。它首先对左子树进行后序遍历,接着对右子树进行后序遍历,最后打印当前节点的值。 6. 主函数:`void main()` 是程序的入口点。在这里,首先创建二叉树,然后分别进行先序、中序和后序遍历并打印结果。`getch()` 函数用于暂停程序,以便用户查看输出结果。 通过递归实现的这三种遍历方法都假设了树的节点按照某种顺序(例如前序遍历的顺序)输入。在实际应用中,这些遍历方法常用于搜索、排序和数据处理等任务。递归是解决这类问题的有效工具,因为它允许我们以简洁的方式表达复杂的问题。然而,对于深的树结构,递归可能会导致大量的函数调用,消耗较大的栈空间,因此在某些情况下,非递归的迭代方法可能更优。

完善代码:#include <stdio.h> #include <malloc.h> #include <conio.h> typedef int ElemType; typedef struct BiTreeNode { ElemType data; struct BiTreeNode *lchild, *rchild; } BiTreeNode,*BiTree; void Visit(BiTree bt) { printf("%d ",bt->data); } int max(int x,int y) { if (x>y) return x; else return y; } //二叉树的先序遍历算法 void PreOrder(BiTree bt) /* bt为指向根结点的指针*/ { if (bt) /*如果bt为空,结束*/ { Visit (bt ); /*访问根结点*/ PreOrder (bt -> lchild); /*先序遍历左子树*/ PreOrder (bt -> rchild); /*先序遍历右子树*/ } } //二叉树的中序遍历递归算法 void InOrder(BiTree bt)/* bt为指向二叉树根结点的指针*/ { } //二叉树的后序遍历递归算法 void PostOrder(BiTree bt) /* bt为指向二叉树根结点的指针*/ { } //结合“扩展先序遍历序列”创建二叉树,递归 BiTree CreateBiTree(ElemType s[]) { BiTree bt; static int i=0; ElemType c = s[i++]; if( c== -1) bt = NULL; /* 创建空树 */ else { bt = (BiTree)malloc(sizeof(BiTreeNode)); bt->data = c; /* 创建根结点 */ bt->lchild = CreateBiTree(s); /* 创建左子树 */ bt->rchild = CreateBiTree(s); /* 创建右子树 */ } return bt; } //根据先序序列、中序序列建立二叉树,递归 BiTree PreInOrder(ElemType preord[],ElemType inord[],int i,int j,int k,int h) { BiTree t; //添加代码 return t; } BiTree CreateBiTree_PreIn(ElemType preord[],ElemType inord[],int n) { BiTree root; if (n<=0) root=NULL; else root=PreInOrder(preord,inord,0,n-1,0,n-1); return root; } //统计叶结点个数 int BitreeLeaf ( BiTree bt ) { if ( bt == NULL ) return 0 ; /* 空树,叶子数为0 */ if ( bt->lchild ==NULL&& bt->rchild == NULL) return 1 ; /*只有一个根结点,叶子数为1*/ return ( BitreeLeaf( bt -> lchild ) + BitreeLeaf ( bt -> rchild )) ; } //统计二叉树的深度 int BitreeDepth ( BiTree bt ) { int d = 0,depthL, depthR; /*depthL和depthR分别为左、右子树的深度*/ if ( bt == NULL ) return 0 ; /*空树,深度为0 */ if ( bt -> lchild ==NULL && bt -> rchild == NULL) return 1; /*叶子结点,深度为1 */ depthL = BitreeDepth ( bt -> lchild ) ; /*左子树深度 */ depthR = BitreeDepth ( bt -> rchild ) ; /*右子树深度 */ d = max (dept

2023-05-22 上传