树
来源:互联网 发布:通过交换数据位运算 编辑:程序博客网 时间:2024/04/30 11:33
链表、队列、栈等属于线性结构,而树是一种重要的非线性结构。
物质基础:树结构在客观世界广泛存在,如人类社会的族谱和各种社会组织结构都可以用树型来描述
遍历:
三种遍历方式:
先根遍历:根-左-右
中根遍历:左-根-右
后根遍历:左-右-根
数据结构的语言描述
(以下代码引自:http://blog.csdn.net/nuaazdh/article/details/7032226)
//二叉树遍历
//作者:nuaazdh
//时间:2011年12月1日
#include<stdio.h>
#include<stdlib.h>
//二叉树结点结构
typedef struct BiTNode{
char ch; //结点数据
struct BiTNode *lchild; //左孩子
struct BiTNode *rchild; //右孩子
}BiTNode,*BiTree;
void AddBiTree(BiTree ,BiTNode *);//创建二叉树
void PreOrderTraverse(BiTNode *); //前序遍历
void InOrderTraverse(BiTNode *); //中序遍历
void PostOrderTraverse(BiTNode *); //后序遍历
void main()
{
char ch;//结点数据
BiTree T,p;//树T,和临时树p
printf("请输入结点内容(以空格未结束标识):");
scanf("%c",&ch);//读入用户输入
T=NULL;
while(ch!=' '){//判断输入
//创建新结点
if(p=(BiTNode *)malloc(sizeof(BiTNode))){
p->ch = ch;
p->lchild = NULL;
p->rchild = NULL;
}
else
{
printf("内存分配出错.\n");
exit(0);
}
if(T==NULL)
T=p;
else
AddBiTree(T,p);
scanf("%c",&ch);//读入用户输入
}
//输出遍历结果
printf("前序遍历:\n");
PreOrderTraverse(T);
printf("\n中序遍历:\n");
InOrderTraverse(T);
printf("\n后序遍历:\n");
PostOrderTraverse(T);
}
//创造二叉树
void AddBiTree(BiTree T,BiTree p)
{
if((p->ch <= T->ch)&&(T->lchild!=NULL))
AddBiTree(T->lchild,p);
else if((p->ch <= T->ch)&&(T->lchild==NULL))
T->lchild=p;
else if(T->rchild!=NULL)
AddBiTree(T->rchild,p);
else T->rchild=p;
}
//前序遍历
void PreOrderTraverse(BiTree T)
{
if(T){
printf("%c ",T->ch);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历
void InOrderTraverse(BiTree T)
{
if(T){
InOrderTraverse(T->lchild);
printf("%c ",T->ch);
InOrderTraverse(T->rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree T)
{
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c ",T->ch);
}
}