数据结构已经上到树的内容了,前面的一些结构有所遗忘,
准备出一个系列写一下已经学过的的数据结构类型的基本操作,
主要内容:创建和删除该数据结构
数据的访问,增加,插入,删除,遍历
也有一些拓展的内容
一来作为自己学习的复习巩固和阶段见证
二来也希望能给以后同样学数据结构的同学们提供参考借鉴
这是这个系列的第二个内容,二叉树的基本操作和算法
这个系列的其他内容:
//**结构体定义**
#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode{
int data;
struct TreeNode* left;//左孩子
struct TreeNode* right;//右孩子
}BiNode,*BiTree;
//**基本函数**
int CreateTree(BiTree* root)//种树
{ int data;
scanf("%d",&data);
if(data<=0)
{ *root=NULL;
return 0;
}
*root=(BiTree)malloc(sizeof(BiNode));
if(!root){
printf("failed\n");
}
if(data>0){
(*root)->data=data;
CreateTree(&((*root)->left));
CreateTree(&((*root)->right));
}
return 0;
}
void DestroyTree(BiTree root)//销毁树
{ if(root)
{ if(root->left)
{ DestroyTree(root->left);
root->left=NULL;
}
if(root->right)
{ DestroyTree(root->tight);
root->right=NULL;
}
}
}
void PreOrderTree(BiTree root)//先序遍历
{ if(root==NULL)
return;
printf("%d",root->data);
PreOrderTree(root->left);
PreOrderTree(root->right);
}
void MidOrderTree(BiTree root)//中序遍历
{ if(root==NULL)
return;
PreOrderTree(root->left);
printf("%d",root->data);
PreOrderTree(root->right);
}
void BackOrderTree(BiTree root)//后序遍历
{ if(root==NULL)
return;
PreOrderTree(root->left);
PreOrderTree(root->right);
printf("%d",root->data);
}
void exchange (BiTree T)//交换左右子树
{ BiTree p;
if(T)
{ p=T->left;
T->left=T->right;
T->right=p;
exchange(T->left);
exchange(T->right);
}
}
void NormalVisit(BiTree T)//层序遍历
{ int i=0,j=0;
BiTree p[200];
if(T)
{ p[j]=T;
j++;
}
while(i<j)
{ printf("%d",p[i]->data);
if(p[i]->left)
{p[j]=p[i]->left;
j++;
}
if(p[i]->right)
{p[j]=p[i]->right;
j++;
}
i++;
}
}
int Depth(BiTree root)//测量树的最大深度
{ if(!root)
{
return 0;
}
else
{ int maxleft=Depth(root->left),maxright=Depth(root->right);
if(maxleft>maxright)
return 1+maxleft;
else
return 1+maxright;
}
}
//**测试主函数**
int main()
{ BiTree root;
CreateTree(&root);
PreOrderTree(root);
printf("\n");
NormalVisit(root);
printf("\n");
printf("%d",Depth(root));
return 0;
}