数据结构的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);
} 


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

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

数据结构 二叉树实现

数据结构 二叉树实现,前序、中序、后序、层序遍历
  • qq920878803
  • qq920878803
  • 2017年04月28日 20:29
  • 118

【数据结构】二叉树的实现

上篇博客中,我们详细说明了树和二叉树的数据结构及其特征,本次,我们用C++来实现一下二叉树 定义二叉树节点结构 二叉树需要定义指向左孩子和右孩子节点的指针,还有存储的数据;我们在这把它的构造函数也写出...
  • qq_31828515
  • qq_31828515
  • 2016年12月27日 12:12
  • 660

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

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

数据结构—二叉树(C语言实现)

以下所有内容来自网易云课堂——数据结构(小甲鱼版) 对于树来说,一旦可以指明他的分支数,那么就可以用链表来实现了 二叉树是应用广泛的树,因为现实世界大部分模型都只包含0,1这两种情况,非常...
  • Emiedon
  • Emiedon
  • 2016年07月20日 09:22
  • 924

数据结构之树和二叉树算法实现(C语言)

待我学有所成,结发与蕊可好。@夏瑾墨 开发环境为Dev-C++ 5.11 编译器:MinGW GCC 6.1.0 64-bit 一、算法程序组建目录结构如下: 第一部分:头文件 1. c...
  • the_Sixth_String
  • the_Sixth_String
  • 2016年10月26日 01:40
  • 2071

(七)数据结构之搜索二叉树的简单实现

1、搜索二叉树的简单定义 二叉搜索树(BST, Binary Search Tree), 也称二叉排序树或者二叉查找树。 定义: a、是一颗二叉树,可以为空,也可以不为空。 b、非空左子树的所...
  • TECH_PRO
  • TECH_PRO
  • 2017年09月17日 19:00
  • 90

数据结构-树和二叉树

  • 2013年08月21日 01:42
  • 110KB
  • 下载

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

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

数据结构 - 树和二叉树的基本运算实现

实验题目设计一个程序exp7-6.cpp,构造一棵哈夫曼树,输出对应的哈夫曼编码和平均查找长度。并用表7.8所示的数据进行验证。实验目的掌握哈夫曼树的构造过程和哈夫曼编码的产生方法;灵活运用二叉树这种...
  • mayuko2012
  • mayuko2012
  • 2016年06月21日 23:06
  • 716
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构的C实现_二叉树
举报原因:
原因补充:

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