创建任意一颗二叉链表树,在输入序列中标明每一个树结点及其两个孩子结点,若孩子结点为空,需要用特殊值标记。
如,若要构造图中的二叉树,需要将所有结点的空指针域标识出来。
因而输入序列:1 2 3 -1 4 5 6 7 8 9 -1 10 11 12 -1 13 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 9999
其中-1对应图中的空结点‘#’,9999表示输入序列结束。
核心代码如下:
//创建一个树节点,返回值表示是否创建完成
bool CreateTreeNode(TNode*& p)
{
int x;
scanf("%d", &x);
if (x >= 9999)//输入值大于等于9999,二叉树创建结束
return false;
if (x >= 0)//在输入序列中,-1表示空结点
{
p = (TNode*)malloc(sizeof(TNode));
p->data = x;
}
else
p = NULL;
return true;
}
void CreateTree(BTree& tree)
{
if (!CreateTreeNode(tree))
{
tree = NULL;
return;
}
//树的层序遍历
Queue queue;
InitQueue(queue);
EnQueue(queue, tree);
TNode* p; void* vp;
while (!IsEmptyQueue(queue))
{
DeQueue(queue, vp);
p = (TNode*)vp;
if (!CreateTreeNode(p->left))return;
if (!CreateTreeNode(p->right))return;
if (p->left != NULL)
EnQueue(queue, p->left);
if (p->right != NULL)
EnQueue(queue, p->right);
}
}
树结点定义和队列定义及其操作如下:
//树结点定义
typedef struct TreeNode
{
int data;
struct TreeNode* left, *right;
}TNode,*BTree;
//队列定义及其操作
typedef struct QueueNode
{
void* data;
struct QueueNode* next;
}QNode;
typedef struct LinkQueue
{
QNode* front, * rear;
}Queue;
void InitQueue(Queue& Q)
{
Q.front = Q.rear = (QNode*)malloc(sizeof(QNode));
Q.front->next = NULL;
}
void EnQueue(Queue& Q, void* x)
{
QNode* s = (QNode*)malloc(sizeof(QNode));
s->data = x;
s->next = NULL;
Q.rear->next = s;
Q.rear = s;
}
bool IsEmptyQueue(Queue Q)
{
return Q.front == Q.rear;
}
bool DeQueue(Queue& Q, void*& x)
{
if (IsEmptyQueue(Q))return false;
QNode* p = Q.front->next;
Q.front->next = p->next;
if (p == Q.rear)
Q.rear = Q.front;
x = p->data;
free(p);
return true;
}
函数调用如下:
void PreOrder(BTree T)
{
if (T != NULL)
{
printf("%d ", T->data);
PreOrder(T->left);
PreOrder(T->right);
}
}
void InOrder(BTree T)
{
if (T != NULL)
{
InOrder(T->left);
printf("%d ", T->data);
InOrder(T->right);
}
}
int main()
{
BTree tree;
CreateTree(tree);
//用先序+中序测试所创建的树是否符合要求
PreOrder(tree);
printf("\n");
InOrder(tree);
return 0;
}