数据结构--------二叉树的建立和前序遍历------递归实现
2014-03-19 14:48
316 查看
代码实现:
#include <stdio.h> #include <stdlib.h> typedef char ElemType; typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree; // 创建一棵二叉树,约定用户遵照前序遍历的方式输入数据 void CreateBiTree(BiTree *T) { char c; scanf("%c", &c); if( ' ' == c ) { *T = NULL; } else { *T = (BiTNode *)malloc(sizeof(BiTNode)); (*T)->data = c; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } } // 访问二叉树结点的具体操作 void visit(char c, int level) { printf("%c 位于第 %d 层\n", c, level); } // 前序遍历二叉树 void PreOrderTraverse(BiTree T, int level) { if( T ) { visit(T->data, level); PreOrderTraverse(T->lchild, level+1); PreOrderTraverse(T->rchild, level+1); } } int main() { int level = 1; BiTree T = NULL; CreateBiTree(&T); PreOrderTraverse(T, level); return 0; }
在此程序中,二叉树的建立和遍历都采用了递归算法。首先对于二叉树的建立,需要用户以前序遍历的方式输入数据,空节点以空格代替来输入,所以实际上是这样的
所以以前序遍历的方式输入数据时应该是这样输入的:AB_D_ _CE_ _ _(其中"_"代表空格)
首先来分析
首先第一个A被scanf()获取然后申请一块内存存储A,接着递归CreatBiTree,进入第二层函数,scanf获取B,接着又申请一块内存存储B,接着递归CreatBiTree,进入第三层函数,然后scanf获取" "(空格),不在进入else执行体,然后返回第二层,接着执行CreateBiTree(&(*T)->rchild);又叠入一层,scanf获取C,并分配空间存储,接着执行CreateBiTree(&(*T)->lchild);scanf获取空格,返回第二层,执行CreateBiTree(&(*T)->rchild);scanf获取空格,返回第一层,然后执行第一层的CreateBiTree(&(*T)->rchild);scanf获取C,并分配内存存储,然后又叠入一层……最后就实现了上图的存储效果。
而对于前序遍历二叉树的递归算法实现,和刚才思路一样,一层一层的叠,只不过叠的过程中不是存储元素,而是输出元素的值和所处位置的层数。总得来说,还是很好理解的
效果展示
相关文章推荐
- 二叉树的建立以及三种遍历方式的递归、非递归的实现
- 数据结构--java实现二叉树的先序、中序、后序、层次遍历及根据先序中序建立二叉树
- 数据结构 —— 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树建立与遍历递归操作c++实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 【数据结构】二叉树前中后序遍历、层序遍历(递归实现)
- 数据结构 二叉树 已知前序中序遍历求后续遍历的递归实现
- 二叉树的递归遍历非递归遍历以及其他二叉树的相关操作实现(数据结构)
- 数据结构/实现二叉树的前序/中序/后序非递归遍历
- 【数据结构】二叉树的前中后序遍历递归和非递归实现
- Java二叉树非递归实现前序遍历
- C++数据结构--二叉树的建立,前序遍历,中序遍历和后序遍历
- 数据结构-二叉树:C++模板类递归实现与非递归实现
- 【数据结构】二叉树结点插入和前序、中序、后序遍历的递归实现
- 数据结构-递归实现二叉树
- 二叉树的建立(非递归建立与定义建立)与基本操作(广度和深度遍历,求叶子树高)实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 【数据结构】二叉树的翻转递归与非递归实现
- 数据结构::二叉树的非递归实现
- 数据结构-二叉树的深度(递归和非递归的实现)