树的前序,中序,后序遍历(递归)
来源:互联网 发布:帝国cms建站系统 编辑:程序博客网 时间:2024/06/05 23:53
描述
树的遍历即给出一个指向树的指针,访问树中的每一个节点。树的遍历有三种基本遍历方式,分别是前序(preorder)、中序(inorder)、后序(postorder)。
递归实现
原理
- 前序(preorder):先访问节点,然后访问该节点的左子树和右子树;
- 中序(inorder) : 先访问该节点的左子树,然后访问该节点,再访问该节点的右子树;
- 后序( postorder) : 先访问该节点的左子树和右子树,然后访问该节点。
代码实现
#include <stdlib.h>#include <stdio.h>#include <string.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef char ElementType;typedef int Status;int index = 0;char str[] = "ABDH#K###E##CFI###G#J##";typedef struct TreeNode{ ElementType data; struct TreeNode *Left; struct TreeNode *Right;}TreeNode, *pTree;Status InitTree(pTree *T){ *T = NULL; return OK;}Status Visit(pTree T){ if(T == NULL) return ERROR; printf("%c ",T->data); return OK;}void DeleteTree(pTree *T){ if(*T) { if((*T)->Left) DeleteTree(&(*T)->Left); if((*T)->Right) DeleteTree(&(*T)->Right); free(*T); *T = NULL; }}void CreateTree(pTree *T){ ElementType ch; ch = str[index++]; if(ch == '#') *T = NULL; else { *T = (pTree)malloc(sizeof(TreeNode)); if((*T) == NULL) exit(0); (*T)->data = ch; CreateTree(&(*T)->Left); CreateTree(&(*T)->Right); }}int TreeDepth(pTree T){ int Ldepth, Rdepth; if(T == NULL) return -1; if(T->Left) Ldepth = TreeDepth(T->Left); else Ldepth = 0; if(T->Right) Rdepth = TreeDepth(T->Right); else Rdepth = 0; return (Ldepth > Rdepth)? Ldepth + 1 : Rdepth + 1;}int TreeNodeCount(pTree T){ if( T == NULL) return 0; return TreeNodeCount(T->Left) + TreeNodeCount(T->Right) + 1;}int TreeIsEmpty(pTree T){ if(T) return FALSE; else return TRUE;}void PreorderTraverse(pTree T, Status (*Visit)(pTree)){ if(T == NULL) return; (*Visit)(T); //printf("%c ",T->data); PreorderTraverse(T->Left,Visit); PreorderTraverse(T->Right,Visit);}void InorderTraverse(pTree T, Status (*Vistit)(pTree)){ if(T == NULL) return; InorderTraverse(T->Left,Visit); (*Visit)(T); InorderTraverse(T->Right,Visit);}void PostorderTraverse(pTree T, Status (*Visit)(pTree)){ if(T == NULL) return; PostorderTraverse(T->Left,Visit); PostorderTraverse(T->Right,Visit); (*Visit)(T);}int main(){ pTree Tree; InitTree(&Tree); CreateTree(&Tree); printf("Tree's Depth is %d\n",TreeDepth(Tree)); printf("Tree's Node number is %d\n",TreeNodeCount(Tree)); if(TreeIsEmpty(Tree)) { printf("Tree is Empty\n"); } printf("PreorderTraverse is :"); PreorderTraverse(Tree,Visit); printf("\n"); printf("InorderTraverse is :"); InorderTraverse(Tree,Visit); printf("\n"); printf("PostorderTraverse is :"); PostorderTraverse(Tree,Visit); printf("\n"); DeleteTree(&Tree); if(TreeIsEmpty(Tree)) { printf("Tree is Delte and Empty\n"); } return 0;}
0 0
- 树的创建、前、中、后序递归遍历
- 二叉树的非递归【前/中/后 序遍历】
- 二叉树的创建,遍历(前序,中序,后序)-递归 非递归
- 二叉树的前序、中序、后序(递归、非递归)遍历java实现
- 数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- 二叉树的递归和非递归遍历(前序、中序、后序)
- 二叉树的前序、中序、后序遍历(递归&非递归)
- 二叉树的前序、中序、后序遍历(递归与非递归)
- 二叉树的递归与非递归遍历(前序、中序、后序)
- 二叉树的递归与非递归遍历(前序、中序、后序)
- 二叉树的递归与非递归遍历(前序、中序、后序)
- 二叉树的递归与非递归遍历(前序、中序、后序)
- 二叉树的非递归遍历以及层次遍历(前序、中序、后序)
- (前、中、后)序遍历二叉树的递归、非递归算法!
- 【数据结构】二叉树(前、中、后)序遍历的递归与非递归算法
- 二叉树的前/中/后 序遍历(递归非递归两种)
- JAVA实现二叉树的前、中、后序遍历(递归与非递归)
- 【二叉树】 前序、中序和后序的递归遍历与非递归遍历
- ListView onTouchEvent onScroll
- Linux下CGI服务器基本工作原理
- android开发之权限问题整理
- Dubbo
- Construct Binary Tree from Preorder and Inorder Traversal
- 树的前序,中序,后序遍历(递归)
- 跨域问题解决方案(HttpClient安全跨域 & jsonp跨域)
- keys
- android:shape属性详解
- iOS学习爬坑记录14:自定义远程推送通知铃声(Custom Alert Sounds)
- Android Camera Api的心得
- Delphi--2~36进制的转换
- Unity 5正式发布
- 单枪匹马:4年只做一个iOS游戏 收入破千万美元