树和二叉树:
树是一种具有多个节点的数据结构,它的特点是根朝上,叶朝下。它的每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树。
二叉树也是树的一种,他的特点是每个根节点最多只能有两个子节点,也就是0,1,2种节点
二叉树的实现:
定义结构体:
typedef struct BSTNode
{
int data;
struct BSTNode *l,*r;
} *BSTree;
二叉树初始化:
void InitTree (BSTree &T)
{
T=(BSTree)malloc(sizeof(BSTree));
T->data=0;
T->l=T->r=NULL;
}//初始化
二叉树的插入:
void InsertTree(BSTree &T,int e)
{
if(!T)//递归结束
{
BSTree S;
S=(BSTree)malloc(sizeof(BSTree));
S->data=e;
S->l=S->r=NULL;
T=S;
}
else if(e<T->data)
{
InsertTree(T->l,e);
}
else
{
InsertTree(T->r,e);
}
}//插入
二叉树的创建:
void TreeCreate(BSTree &T)
{
int n;
scanf("%d",&n);
T->data=n;
while(1)
{
scanf("%d",&n);
InsertTree(T,n);
if(getchar()=='\n')
{
break;
}
}
}
二叉树的遍历:
- 前序遍历
- 中序遍历
- 后序遍历
前序遍历:
根节点->左子树->右子树
void print(BSTNode* T)
{
if(T == NULL){
return;
}
printf("%d ", T->data);
print(T->left);
print(T->right);
}
中序遍历:
左子树->根节点->右子树
void print(BSTnode* T)
{
if(T == NULL)
{
return;
}
printf("%d ", T->data);
inorder(T->left);
inorder(T->right);
}
后序遍历:
左子树->右子树->根节点
void print(BSTnode* T)
{
if(T == NULL)
{
return;
}
printf("%d ", T->data);
inorder(T->left);
inorder(T->right);
}
完整代码:
#include<stdio.h>//前序遍历
#include <stdlib.h>
#include <string.h>
typedef struct BSTNode
{
int data;
struct BSTNode *l,*r;
} *BSTree;
void InitTree (BSTree &T)
{
T=(BSTree)malloc(sizeof(BSTree));
T->data=0;
T->l=T->r=NULL;
}//初始化
void InsertTree(BSTree &T,int e)
{
if(!T)//递归结束
{
BSTree S;
S=(BSTree)malloc(sizeof(BSTree));
S->data=e;
S->l=S->r=NULL;
T=S;
}
else if(e<T->data)
{
InsertTree(T->l,e);
}
else
{
InsertTree(T->r,e);
}
}//插入
void TreeCreate(BSTree &T)
{
int n;
scanf("%d",&n);
T->data=n;
while(1)
{
scanf("%d",&n);
InsertTree(T,n);
if(getchar()=='\n')
{
break;
}
}
}
void print(BSTree T)
{
if(T)
{
printf("%d ",T->data);
print(T->l);
print(T->r);
}
}
int main()
{
BSTree T;
InitTree(T);
printf("请输入数据:");
TreeCreate(T);
printf("输出二叉树: ");
print(T);
return 0;
}