二叉树准备数据
#define MAXLEN 20//最大长度
typedef char DATA;//定义元素类型
typedef struct CBT//定义二叉树结点类型
{
DATA data;//元素数据
struct CBT* left;//左子树结点指针
struct CBT* right;//右子树结点指针
}CBTType;
初始化二叉树
CBTType* InitTree()//初始化二叉树的根
{
CBTType* node;
if(node=(CBTType*)malloc(sizeof(CBTType)))//申请内存
{
printf("请输入一个根结点数据:\n");
scanf("%s",&node->data);
node->left=NULL;
node->right=NULL;
if(node!=NULL)//如果二叉树根节点不为空
{
return node;
}
else
{
return NULL;
}
}
return NULL;
}
在这里,首先申请内存,然后由用户输入一个根结点数据,并将指向左子树和右子树的指针设置为空,即可完成二叉树的初始化工作。
添加结点
void AddTreeNode(CBTType* treeNode)
{
CBTType *pnode,*parent;
DATA data;
char menusel;
if(pnode=(CBTType*)malloc(sizeof(CBTType)))
{
printf("输入二叉树结点数据:\n");
fflush(stdin);//清空输入缓冲区
scanf("%s",&data);
pnode->left=NULL;
pnode->rignt=NULL;//设置左右子树为空
printf("输入该结点的父结点数据:\n");
fflush(stdin);//清空输入缓冲区
scanf("%s",%data);
parent=TreeFindNode(treeNode,data);//查找指定数据的结点
if(!parent)
{
printf("未找到该父结点!\n");
free(pnode);//释放创建的结点内存
return;//退出函数
}
printf("1.添加该结点到左子树\n2.添加该结点到右子树\n");
do
{
cin>>menusel;
if(menusel=='1'||menusel=='2')
{
if(parent==NULL)
{
printf("不存在父结点,请先设置父结点!\n");
}
else
{
switch(menusel)
{
case 1:
if(parent->left)//左子树不为空
{
printf("左子树结点不为空!\n");
}
else
{
parent->left=pnode;
}
break;
case 2:
if(parent->left)//左子树不为空
{
printf("左子树结点不为空!\n");
}
else
{
parent->left=pnode;
}
break;
default:
printf("无效参数!\n");
}
}
}
}while(menusel!=1&&menusel!=2)//添加结点结束条件
}
}
查找结点
查找结点就是遍历二叉树中的每一个结点,逐个比较数据,当找到目标数据时将返回该数据所在结点的指针。查找结点的示例代码如下所示:
CBTType *TreeFindNode(CBTType* treeNode,DATA data)
{
CBTType* ptr;
if(treeNode==NULL)
{
return NULL;
}
else
{
if(treeNode->data=data)
{
return treeNode;
}
else
{
if(ptr=TreeFindNode(treeNode->left,data))
{
return ptr;
}
else if(ptr=TreeFindNode(treeNode->right,data))
{
return ptr;
}
else
{
return NULL;
}
}
}
}
计算二叉树深度
int TreeDepth(CBTType* treeNode)
{
if (treeNode== NULL)
return 0;
int nLeft = TreeDepth(treeNode->left);//左子树深度(递归调用)
int nRight = TreeDepth(treeNode->right);//右子树深度
return (nLeft>nRight) ? (nLeft+1):(nRight+1);
}
清空二叉树
void ClearTree(CBTType* treeNode)
{
if(treeNode)
{
ClearTree(treeNode->left);//清空左子树
ClearTree(tree->right);//清空右子树
free(treeNode);//释放当前结点所占内存
treeNode=NULL;
}
}
显示结点数据
void TreeNodeData(CBTType* p)
{
printf("%c",p->data);
}
遍历二叉树