学习二叉树,对于初学者而言,第一重要的事情就是要学会创建一棵二叉树。
1. 层次输入法创建二叉链表
按完全二叉树结点编号规则顺序输入结点值,建立二叉链表
/*************************************************
函数功能:层次输入法创建二叉链表
函数输入:无
函数输出:二叉链表根结点
键盘输入:按完全二叉树结点编号规则顺序输入结点值,空结点为@
***************************************************/
BinTreeNode *Q[16]; //队列Q放树结点地址
BinTreeNode *CreatBTree()
{
char ch;
int front=1,rear=0;
BinTreeNode *root = NULL, *s;
ch=getchar();
while(ch!='#') //结束标志
{ s=NULL;
if (ch!='@') //空结点
{ s=(BinTreeNode *)malloc(sizeof(BinTreeNode)); //生成新结点
s->data=ch;
s->lchild=NULL;
s->rchild=NULL;
}
Q[++rear]=s; //结点入队
if (rear==1) root=s;//记下根结点
else
{ if (s && Q[front])
{ if (rear%2==0) Q[front]->lchild=s; //左孩子入队
else Q[front]->rchild=s; //右孩子入队
}
if (rear%2==1) front++; //新结点是双亲的右孩子,则双亲结点出队
}
ch=getchar();
}
return root;
}
2. 用先序遍历的方法建立二叉链表
/**************************************
函数功能:用先序遍历的方法建立二叉链表
函数输入:(二叉链表根结点)
函数输出:二叉链表根结点
键盘输入:树的先序遍历序列,子树为空时输入@
**************************************************/
BinTreeNode *CreatBTree_DLR(BinTreeNode *root )
{
char ch;
scanf("%c",&ch);
if (ch=='@') root=NULL; //ch=='@'子树为空,则root=NULL返回
else
{
root=( BinTreeNode * )malloc(sizeof(BinTreeNode));// 建立(根)结点
root->data = ch;
//构造左子树链表,并将左子树根结点指针赋给(根)结点的左孩子域
root->lchild=CreatBTree_DLR(root->lchild);
//构造右子树链表,并将右子树根结点指针赋给(根)结点的右孩子域
root->rchild=CreatBTree_DLR(root->rchild);
}
return (root);
}
下面是测试用例:
/*****************************************************
测试功能:树的各种创建算法
测试函数:
1. 层次输入法创建二叉链表CreatBTree
2. 用先序遍历的方法建立二叉链表CreatBTree_DLR
*******************************************************/
#include "stdio.h"
#include "stdlib.h"
typedef char datatype;
typedef struct node
{
datatype data;
struct node *lchild,*rchild;
} BinTreeNode;
BinTreeNode *Q[16]; //队列Q放树结点地址
int main()
{
BinTreeNode *tPtr;
printf("按完全二叉树结点编号规则顺序输入结点值,空结点为@");
tPtr=CreatBTree();
printf("树的先序遍历序列,子树为空时输入@");
tPtr=CreatBTree_DLR(tPtr);
return 0;
}
测试样例
1.层次输入法创建二叉链表
图5. 43二叉树与对应二叉链表
输入ABCDE@F@@GH#
2.用先序遍历的方法建立二叉链表
测试样例1
输入:先序遍历序列321@@@4@@
测试样例2
输入:先序遍历序列ABD@F@@@CE@@@#