三九宝宝网宝宝教育教学论文

c语言实现二叉树的先序中序后序的递归和非递归算法和层次遍历

12月30日 编辑 39baobao.com

[c语言里面的函数递归调用看不懂了]先调用fun(3),fun(3)中调用fun(2),fun(2)中调用fun(1),fun(1)中调用fun(0),此时n=0,,条件不成立,这时开始以一层一层返回,返回到fun(1),fun(1)中第一条调用完了(刚返回的),--n此时n=...+阅读

#include// malloc()等 #include// 标准输入输出头文件,包括EOF(=^Z或F6),NULL等 #include// atoi(),exit() #include// 数学函数头文件,包括floor(),ceil(),abs()等#define ClearBiTree DestroyBiTree // 清空二叉树和销毁二叉树的操作一样 typedef struct BiTNode { int data; // 结点的值 BiTNode *lchild,*rchild; // 左右孩子指针 }BiTNode,*BiTree; int Nil=0; // 设整型以0为空 void visit(int e) { printf("%d ",e); // 以整型格式输出 } void InitBiTree(BiTree &T) { // 操作结果:构造空二叉树T T=NULL; } void CreateBiTree(BiTree &T) { // 算法6.4:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义), // 构造二叉链表表示的二叉树T。

变量Nil表示空(子)树。修改 int number; scanf("%d",&number); // 输入结点的值 if(number==Nil) // 结点的值为空 T=NULL; else // 结点的值不为空 { T=(BiTree)malloc(sizeof(BiTNode)); // 生成根结点 if(!T) exit(OVERFLOW); T->data=number; // 将值赋给T所指结点 CreateBiTree(T->lchild); // 递归构造左子树 CreateBiTree(T->rchild); // 递归构造右子树 } } void DestroyBiTree(BiTree &T) { // 初始条件:二叉树T存在。

操作结果:销毁二叉树T if(T) // 非空树 { DestroyBiTree(T->lchild); // 递归销毁左子树,如无左子树,则不执行任何操作 DestroyBiTree(T->rchild); // 递归销毁右子树,如无右子树,则不执行任何操作 free(T); // 释放根结点 T=NULL; // 空指针赋0 } } void PreOrderTraverse(BiTree T,void(*Visit)(int)) { // 初始条件:二叉树T存在,Visit是对结点操作的应62616964757a686964616fe4b893e5b19e31333337386536用函数。

修改算法6.1 // 操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次 if(T) // T不空 { Visit(T->data); // 先访问根结点 PreOrderTraverse(T->lchild,Visit); // 再先序遍历左子树 PreOrderTraverse(T->rchild,Visit); // 最后先序遍历右子树 } } void InOrderTraverse(BiTree T,void(*Visit)(int)) { // 初始条件:二叉树T存在,Visit是对结点操作的应用函数 // 操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次 if(T) { InOrderTraverse(T->lchild,Visit); // 先中序遍历左子树 Visit(T->data); // 再访问根结点 InOrderTraverse(T->rchild,Visit); // 最后中序遍历右子树 } } void PostOrderTraverse(BiTree T,void(*Visit)(int)) { // 初始条件:二叉树T存在,Visit是对结点操作的应用函数 // 操作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次 if(T) // T不空 { PostOrderTraverse(T->lchild,Visit); // 先后序遍历左子树 PostOrderTraverse(T->rchild,Visit); // 再后序遍历右子树 Visit(T->data); // 最后访问根结点 } } void main() { BiTree T; InitBiTree(T); // 初始化二叉树T printf("按先序次序输入二叉树中结点的值,输入0表示节点为空,输入范例:1 2 0 0 3 0 0\n"); CreateBiTree(T); // 建立二叉树T printf("先序递归遍历二叉树:\n"); PreOrderTraverse(T,visit); // 先序递归遍历二叉树T printf("\n中序递归遍历二叉树:\n"); InOrderTraverse(T,visit); // 中序递归遍历二叉树T printf("\n后序递归遍历二叉树:\n"); PostOrderTraverse(T,visit); // 后序递归遍历二叉树T }

以下为关联文档:

c语言递归调用求详解conver('A') { 'A'< 'D' convert('B') //('B' = 'A'+1) { 'B'< 'D' convert('C') //C = B+1 { 'C'<'D' convert('D') { 因为'D'...

C语言指针递归调用怎么搞#include<stdio.h> int main() { void sort(int *p,int n); int i,n; int *p,num[20]; printf("input n\n"); scanf("%d",&n); printf("please input these numbers\n"); for(i=0;...

c语言用递归调用求函数#include<stdio.h> double add (double x,double n)//int 改为double {int N=1,p=-1,q=1,i,j,k; double m=1.0; for(k=1;k<=(2*n-1);k++) N=N*k; for(i=1;i<(2*n-1);i++) //...

C语言你编程:用递归方法实现对一个整数的逆序输出#include void shiftnumber(int x) { //int temp,i; if(x/10==0) printf("%3d",x); else { printf("%3d",x%10); x/=10; shiftnumber( x); } } int main() { int x; printf("inpu...

C语言:用递归的方式对数组排序#include <stdio.h> #define N 8 void selection_sort(int a[], int n) { daoint i, t, imax = 0; if(n < 1) return; for(i = 1; i < n; ++i) { 回if(a[imax] < a[i]) imax...

c语言中什么是函数的递归能举个例子么所谓递归,说的简单点,就是函数自己调用自己,然后在某个特定条件下。结束这种自我调用。 如果不给予这个结束条件,就成了无限死循环了。这样这个递归也就毫无意义了。 如下面问题...

c程序设计递归函数举例递归调用即自己调用自己,与其他嵌套调用无本质区别,即在自身函数中再嵌套一个自身函数;例如计算6+7+6+7+8,可编程如下: #include <iostream.h> int fib(int a,int b); void main(...

c语言递归函数递归求阶乘的吧,不过你写的有问题,函数既然接受形参n,在函数里就不用再读取了;而且函数返回的是long类型,应该强制转换返回值。 #include <stdio.h> long rfact (int n) { float...

C语言用递归函数实现求1 2 31 2 3 4 5 6 7 8 9 10 11 #include <stdio.h> intsum(intn) { if(n == 1)return1; returnn+sum(n-1); } intmain() { printf("%d\n", sum(10)); return0; }...

推荐阅读
图文推荐