数据结构 二叉树的建立、遍历、销毁的递归算法(C语言)

这些是较为简单的二叉树的建立、遍历、销毁的递归算法。
假设二叉树都用二叉链作为存储结构,并约定根节点的指针用T表示。

为了简化问题,我们用char类型的字符代替树中的数据,并且用前序遍历的算法,建立二叉树过程如下:

  1. 输入一个根节点。
  2. 若输入的是“ ”(即空格字符),则表明改结点为空,T设置为NULL;
  3. 若输入的不是“ ”(空格字符),则将字符存入到T->data中,并依次递归建立它的左子树T->lchild,和右子树T->rchild;

测试的源代码如下:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3
 4 typedef struct BTREE {
 5     char data;
 6     struct BTREE *lchild, *rchild;
 7 }BT,*LBTREE;
 8
 9
10
11 void Creat(LBTREE *T)                        //前序遍历的递归算法
12 {
13     char ch;
14     ch=getchar();                            //从缓冲一个个读取字符
15     if (ch == ‘ ‘)                //输入空格则该节点为空(即不存在)
16         *T = NULL;
17     else
18     {
19         (*T) = (LBTREE)malloc(sizeof(BT));
20         (*T)->data=ch;
21         Creat(&((*T)->lchild));
22         Creat(&((*T)->rchild));
23     }
24
25 }
26
27 void Pretravers(LBTREE T)                    //前序遍历
28 {
29     if (T != NULL)
30     {
31         printf("% c", T->data);
32         Pretravers(T->lchild);
33         Pretravers(T->rchild);
34     }
35
36 }
37
38 void Inortravers(LBTREE T)                    //中序遍历
39 {
40     if (T != NULL)
41     {
42         Inortravers(T->lchild);
43         printf("% c", T->data);
44         Inortravers(T->rchild);
45     }
46 }
47
48 void Postravers(LBTREE T)                    //后续遍历
49 {
50     if (T != NULL)
51     {
52         Postravers(T->lchild);
53         Postravers   (T->rchild);
54         printf("% c", T->data);
55     }
56 }
57
58 void Distroyb(LBTREE T)            //销毁二叉树(同样使用递归的方式)
59 {
60     if (T != NULL)
61     {
62         Distroyb(T->lchild);
63         Distroyb(T->rchild);
64         free(T);
65     }
66 }
67
68 void main(void)
69 {
70     LBTREE T=NULL;
71     puts("输入二叉树数据");                        //这里用的是
72         getchar(),                                  //会读取换行符,应将所有数据在一行输入
73     Creat(&T);
74     puts("前序遍历输出:");
75     Pretravers(T);
76     puts("");
77     puts("中序遍历输出:");
78     Inortravers(T);
79     puts("");
80     puts("后续遍历输出:");
81     Postravers(T);
82     puts("");
83     Distroyb(T);
84 }

结果如下:

建立的二叉树是这样的:

原文地址:https://www.cnblogs.com/codeloop/p/11775758.html

时间: 2024-08-07 05:35:50

数据结构 二叉树的建立、遍历、销毁的递归算法(C语言)的相关文章

二叉树后序遍历的非递归算法(C语言)

首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归) 这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远! 折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问过,考虑过修改二叉树结点的数据结构,增加一个visit域,或者建一个栈存储已访问的结点.都比较麻烦没有调试成功.若将右子树也入栈,如果没有访问标记的话,会改变访问的次序,甚至出现死循环,这是比较危险的情况.从借鉴的博文里,摘录并改写为C的代码,基本上没有改动.后续问题努力写出自己的原创代码. 二叉树

[数据结构] 二叉树的建立及其基本操作

如图: 代码: #include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> using namespace std; char ch; typedef struct BinNode { char data; struct BinNode *lchild,*rchild; }BinNode,*BinTree; //二叉树链式存储结构 void CreateBin

大话数据结构——二叉树的建立于遍历

#include<iostream> #include<assert.h> #include<stdlib.h> #include <stdio.h> #include <cstdlib> using namespace std; #define OK 1 #define TURE 1 #define ERROR 0 #define FALSE 0 typedef char elemtype; elemtype ch; //二叉树的二叉链表结点结

[数据结构]二叉树创建与遍历

实验报告:二叉树创建与遍历 一.问题描述 二叉树是一种实用范围很广的非线性结构,一棵非空二叉树有也只有一个根结点,每个结点最多有两个子树,我们称为左子树与右子树,当一个结点的左.右子树都是空的时,沃恩称此结点为叶子结点. 二叉树有一些很好的性质,这里不再赘述.考虑如何存储一棵树,本实验选择使用链式存储结构——二叉链表:如果事先知道需要存储的二叉树是满二叉树或者完全二叉树,则可以考虑使用顺序存储,否则将浪费大量的存储空间. 对于一棵既成的二叉树,有三种遍历方式——先序.中序与后序.可以证明,一棵形

二叉树3种遍历的非递归算法

http://blog.csdn.net/pipisorry/article/details/37353037 c实现: 1.先序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem[maxsize]; int top; } SqStack; void PreOrderUnrec(Bitree t) { SqStack s; StackInit(s); p=t; while (p!=null || !StackEmpty(s)) { w

数据结构-二叉树的各种遍历(先中后层序!!)

最近在写数据结构中二叉树的遍历,这里总结一下: 先序递归遍历: void PreTravel(BiTree T) {//前序递归遍历 if(T) { printf("%c",T->data); PreTravel(T->lchild); PreTravel(T->rchild); } } 中序递归遍历: void MidTravel(BiTree T) {//中序递归遍历 if(T) { MidTravel(T->lchild); printf("%c

数据结构 二叉树的建立及三种遍历方法

#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; typedef struct Binode{ char data; struct Binode *lchild,*rchild; }Binode,*Bitree; void CreatTREE(Bitree &T) { char ch; scanf("%c&

常用数据结构二叉树的建立

二叉树是最重要的数据结构之一,先序建立二叉树的过程如下. #include<stdio.h> #include<stdlib.h> typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTnode,*BiTree; BiTree Create(BiTree root)//先序建立二叉树 { char ch; printf("input data:"); root=(BiTre

数据结构二叉树构造及遍历详解

前言 最近学到了二叉树,就学着将二叉树构造,并尝试三种遍历操作.本次主要使用递归,回头会整理非递归的方法. 定义二叉树 1 typedef struct BinaryTree 2 { 3 TelemType data; 4 struct BinaryTree *lchild; 5 struct BinaryTree *rchild; 6 }*Node,node; 其中要注意Node是结构体指针,这样定义以后使用会方便很多. 构造二叉树 1 Node CreatTree() 2 { 3 Node