数据结构的C实现_二叉树

原创 2012年03月22日 18:40:33
//编译环境 visual studio 2008,win32 console application.

//BiTree.c

//二叉树及其递归和非递归遍历
#include <stdlib.h>
#include <stdio.h>
#define MAXKEY 100
#define OK 1

typedef char elemType;

typedef struct _node
{
elemType key;
struct _node *lchild;
struct _node *rchild;
}Node;//二叉树节点



//递归先序遍历
void PreOrder_R(Node *tree)
{
if(tree!=NULL)
{
printf(" %c",tree->key);
PreOrder_R(tree->lchild);
PreOrder_R(tree->rchild);
}
}

//递归中序遍历
void InOrder_R(Node *tree)
{
if(tree!=NULL)
{
InOrder_R(tree->lchild);
printf(" %c",tree->key);
InOrder_R(tree->rchild);
}
}

//递归后序遍历
void PostOrder_R(Node *tree)
{
if(tree!=NULL)
{
PostOrder_R(tree->lchild);
PostOrder_R(tree->rchild);
printf(" %c",tree->key);
}
}

//非递归先序遍历
void PreOrder_NR(Node *tree)
{
Node *stack[100];
int top=0;
Node *p=tree;
while(p!=NULL||top>0)
{
while(p!=NULL)
{
printf(" %c",p->key);
stack[top++]=p;//根节点入栈
p=p->lchild;
}
p=stack[--top];
p=p->rchild;
}
}
//非递归中序遍历
void InOrder_NR(Node *tree)
{
Node *stack[100];
int top=0;
Node *p=tree;
while(p!=NULL||top>0)
{
while(p!=NULL)
{
stack[top++]=p;
p=p->lchild;
}//左孩子入栈
p=stack[--top];
printf(" %c",p->key);
p=p->rchild;
}
}

//非递归后序遍历
void PostOrder_NR(Node *tree)
{
Node *stack[100];
int top=0;
Node *p=tree;
Node *lastvisit=NULL;
while(p!=NULL||top>0)
{
while(p!=NULL)
{
stack[top++]=p;
p=p->lchild;
}//左孩子入栈
p=stack[top-1];
if(p->rchild==NULL||p->rchild==lastvisit)
{
printf(" %c",p->key);
--top;
lastvisit=p;
p=NULL;
}//访问中间节点
else
p=p->rchild;
}
}

//清空树
int DeleteTree(Node *tree)
{
if(tree!=NULL)
{
DeleteTree(tree->lchild);
DeleteTree(tree->rchild);
free(tree);
}
return OK;
}

main()
{
//创建一个二叉树
Node *tree,*p;
p=malloc(sizeof(Node));
p->key='A';
tree=p;

p=malloc(sizeof(Node));
p->key='B';
tree->lchild=p;

p=malloc(sizeof(Node));
p->key='C';
p->lchild=NULL;
p->rchild=NULL;
tree->lchild->lchild=p;

p=malloc(sizeof(Node));
p->key='D';
p->lchild=NULL;
p->rchild=NULL;
tree->lchild->rchild=p;

p=malloc(sizeof(Node));
p->key='E';
p->lchild=NULL;
tree->rchild=p;

p=malloc(sizeof(Node));
p->key='F';
p->lchild=NULL;
p->rchild=NULL;
tree->rchild->rchild=p;

printf("递归先序遍历:\n");
PreOrder_R(tree);

printf("\n非递归先序遍历:\n");
PreOrder_NR(tree);

printf("\n递归中序遍历:\n");
InOrder_R(tree);

printf("\n非递归中序遍历:\n");
InOrder_NR(tree);

printf("\n递归后序遍历:\n");
PostOrder_R(tree);

printf("\n非递归后序遍历:\n");
PostOrder_NR(tree);
printf("\n");
DeleteTree(tree);
} 


相关文章推荐

数据结构之---二叉树C实现

学过数据结构的都知道树,那么什么是树? 树(tree)是包含n(n>0)个结点的有穷集,其中: (1)每个元素称为结点(node); (2)有一个特定的结点被称为根结点或...

【数据结构】二叉树的原理及实现学习总结

二叉树概述数组、向量、链表都是一种顺序容器,它们提供了按位置访问数据的手段。而很多情况下,我们需要按数据的值来访问元素,而不是它们的位置来访问元素,二叉树在很大程度上解决了这个问题,二叉树是按值来保存...

数据结构之树的三种存储结构

说道存储结构,我们就会

Linux C 数据结构——二叉树

一、树的概念       树(tree)是n(n>=0)个节点的有限集合T,它满足两个条件: 1)有且仅有一个特定的称为根(root)的节点; 2)其余的节点可以分为m(m>=0)个互不相交的有限结合...

数据结构_6:树:C语言_基本概念

树的基本概念 根结点 结点的度 叶结点 树的度=最大结点最大的度树的深度=最大层数 结点的深度=(自根结点)自上而下的累加 结点的高度=(自叶节点)自下而上的累加 二叉树五种形态 空二叉树;只有一个根...

白话数据结构之二叉树(Same Tree)java,C实现

小哥我今日突然诗性大发想写点什么,可是又找不到头绪于是乎直接打开google,登陆leetcode 找到database 目录栏的tree栏目。闲话我们从倒数的第一个题目开始先带着大家从easy 部分...

C/C++基本数据结构:有序二叉树的基本概念和实现

二叉树 1.基本特征 1)表达树形结构的最简模型,每个节点最多有两个子节点——左子节点和右子节点。 2)单根。每个子节点有且仅有一个父节点,整棵树只有一个根节点。 3)具有递归的结构特征,用递...
  • gwjxl
  • gwjxl
  • 2014年04月17日 12:04
  • 860

数据结构(C实现)------- 遍历二叉树

二叉树是另一中树型结构,它的特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。...

数据结构二叉树实现

  • 2014年03月18日 10:49
  • 121KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构的C实现_二叉树
举报原因:
原因补充:

(最多只允许输入30个字)