测试结果:
创建二叉排序树,请输入结点的总数量: 7
请连续输入7个结点的数据: 2 4 1 3 7 9 5
先序遍历序列: 2 1 4 3 7 5 9
中序遍历序列: 1 2 3 4 5 7 9
后序遍历序列: 1 3 5 9 7 4 2
输入要查找的结点的数值(0退出): 9
该结点的层次是 4
输入要查找的结点的数值(0退出): 7
该结点的层次是 3
二叉树示意图:
2
/ \
1 4
/ \
3 7
/ \
5 9
#include "stdio.h"
#include "stdlib.h"
struct Tree
{
int data;
struct Tree *left;
struct Tree *right;
};
typedef struct Tree TreeNode;
typedef TreeNode *Bitree;
//插入结点
Bitree insertNode(Bitree root,int data)
{
Bitree newnode;
Bitree current;
Bitree back;
newnode=(Bitree)malloc(sizeof(TreeNode));
if(newnode==NULL)
{
printf("\n动态分配内存出错.\n");
exit(1);
}
newnode->data=data;
newnode->left=NULL;
newnode->right=NULL;
if(root==NULL)
{
return newnode;
}
else
{
current=root;
while(current!=NULL)
{
back=current;
if(current->data > data)
{
current=current->left;
}
else
{
current=current->right;
}
}
if(back->data > data)
{
back->left=newnode;
}
else
{
back->right=newnode;
}
}
return root;
}
//创建二叉排序树(非递归)
Bitree createTree()
{
Bitree root=NULL;
int len;
int data;
int i;
printf("创建二叉排序树,请输入结点的总数量: ");
scanf("%d",&len);
printf("请连续输入%d个结点的数据: ",len);
for(i=0;i<len;i++)
{
scanf("%d",&data);
root=insertNode(root,data);
}
return root;
}
//先序遍历(递归法)
void preOrder(Bitree ptr)
{
if(ptr!=NULL)
{
printf("%d ",ptr->data);
preOrder(ptr->left);
preOrder(ptr->right);
}
}
//中序遍历(递归法)
void inOrder(Bitree ptr)
{
if(ptr!=NULL)
{
inOrder(ptr->left);
printf("%d ",ptr->data);
inOrder(ptr->right);
}
}
//后序遍历(递归法)
void postOrder(Bitree ptr)
{
if(ptr!=NULL)
{
postOrder(ptr->left);
postOrder(ptr->right);
printf("%d ",ptr->data);
}
}
//计算结点的层次(非递归)
int findLevel(Bitree root,int data)
{
Bitree current;
int nLevel;
if(root==NULL)
{
return -1;
}
else
{
current=root;
nLevel=0;
while(current!=NULL)
{
nLevel++;
if(current->data > data)
{
current=current->left;
}
else if(current->data < data)
{
current=current->right;
}
else
{
return nLevel;
}
}
}
return 0;
}
int main()
{
Bitree root=NULL;
int data;
int nLevel;
root=createTree(); //创建二叉排序树
printf("先序遍历序列: ");
preOrder(root);
printf("\n");
printf("中序遍历序列: ");
inOrder(root);
printf("\n");
printf("后序遍历序列: ");
postOrder(root);
printf("\n");
while(1)
{
printf("输入要查找的结点的数值(0退出): ");
scanf("%d",&data);
if(data==0)
{
break;
}
//计算结点的层次(非递归)
nLevel=findLevel(root,data);
if(nLevel == -1)
{
printf("二叉树没有数据.\n");
}
else if(nLevel == 0)
{
printf("二叉树没有该数据.\n");
}
else
{
printf("该结点的层次是 %d\n",nLevel);
}
}
printf("\n");
return 0;
}
温馨提示:答案为网友推荐,仅供参考