#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef char DataType;
typedef struct Node
{
DataType data;
struct Node *leftChild;
struct Node *rightChild;
}BiTreeNode;
void Init(BiTreeNode **root)
{
*root=(BiTreeNode *)malloc(sizeof(BiTreeNode));
(*root)->leftChild=NULL;
(*root)->rightChild=NULL;
}
BiTreeNode *InsertLeftNode(BiTreeNode *curr,DataType x)//若当前结点curr非空,则在curr的左子树插入元素值为x的新结点,原curr所指结点的左子树成为新插入结点的左子树,若插入成功,则返回新插入结点的指针,否则返回空指针
{
BiTreeNode *s,*t;
if(curr == NULL)return NULL;
t=curr->leftChild;
s=(BiTreeNode *)malloc(sizeof(BiTreeNode));
s->data=x;
s->leftChild=t;
s->rightChild=NULL;
curr->leftChild=s;
return curr->leftChild;
}
BiTreeNode *InsertRightNode(BiTreeNode *curr,DataType x)//若当前结点curr非空,则在curr的右子树插入元素值为x的新结点,原curr所指结点的右子树成为新插入结点的右子树,若插入成功,则返回新插入结点的指针,否则返回空指针
{
BiTreeNode *s,*t;
if(curr == NULL)return NULL;
t=curr->rightChild;
s=(BiTreeNode *)malloc(sizeof(BiTreeNode));
s->data=x;
s->rightChild=t;
s->leftChild=NULL;
curr->rightChild=s;
return curr->rightChild;
}
void Destroy(BiTreeNode **root)
{
if((*root)!=NULL&&(*root)->leftChild!=NULL)
Destroy(&(*root)->leftChild);
if((*root)!=NULL&&(*root)->rightChild!=NULL)
Destroy(&(*root)->rightChild);
free(*root);
}
BiTreeNode *DeleteLeftChild(BiTreeNode *curr)//若curr为空,则删除curr所指结点的左子树,若删除成功,则返回删除结点的双亲结点指针,否则返回空指针
{
if(curr==NULL||curr->leftChild==NULL)return NULL;
Destroy(&curr->leftChild);
curr->leftChild=NULL;
return curr;
}
BiTreeNode *DeleteRightChild(BiTreeNode *curr)//若curr为空,则删除curr所指结点的右子树,若删除成功,则返回删除结点的双亲结点指针,否则返回空指针
{
if(curr==NULL||curr->rightChild==NULL)return NULL;
Destroy(&curr->rightChild);
curr->rightChild=NULL;
return curr;
}
void Visit(DataType item)
{
printf("%c ",item);
}
void PreOrder(BiTreeNode *root,void visit(DataType item))//前序遍历二叉树
{
if(root!=NULL)
{
visit(root->data);
PreOrder(root->leftChild,visit);
PreOrder(root->rightChild,visit);
}
}
void InOrder(BiTreeNode *root,void visit(DataType item))//中序遍历二叉树
{
if(root!=NULL)
{
InOrder(root->leftChild,visit);
visit(root->data);
InOrder(root->rightChild,visit);
}
}
void PostOrder(BiTreeNode *root,void visit(DataType item))//后序遍历二叉树
{
if(root!=NULL)
{
PostOrder(root->leftChild,visit);
PostOrder(root->rightChild,visit);
visit(root->data);
}
}
void PrintBiTree(BiTreeNode *root,int n)//逆时针旋转90度打印二叉树,n为缩进层次,初始值为0
{
int i;
if(root==NULL)return ;//递归出口
PrintBiTree(root->rightChild,n+1);//遍历打印右子树
for(i=0;i<n-1;i++)printf(" ");
if(n>0)
{
printf("----");
printf("%c\n",root->data);
}
PrintBiTree(root->leftChild,n+1);//遍历打印左子树
}
BiTreeNode *Search(BiTreeNode *root,DataType x)
{
BiTreeNode *find=NULL;
if(root!=NULL)
{
if(root->data==x)
find=root;
else
{
find=Search(root->leftChild,x);
if(find=NULL)
find=Search(root->rightChild,x);
}
}
return find;
}
int main()
{
BiTreeNode *root,*p,*find;
char x='E';
Init(&root);
p=InsertLeftNode(root,'A');
p=InsertLeftNode(p,'B');
p=InsertLeftNode(p,'D');
p=InsertRightNode(p,'G');
p=InsertRightNode(root->leftChild,'C');
InsertLeftNode(p,'E');
InsertRightNode(p,'F');
PrintBiTree(root,0);
printf("前序遍历:");
PreOrder(root->leftChild,Visit);
printf("中序遍历:");
InOrder(root->leftChild,Visit);
printf("后序遍历:");
PostOrder(root->leftChild,Visit);
find=Search(root,x);
if(find!=NULL)
printf("\n数据元素%c在二叉树中\n",x);
else
printf("\n数据元素%c不在二叉树中\n",x);
Destroy(&root);
}
数据结构学习之二叉树
最新推荐文章于 2021-07-17 12:48:26 发布