这道题考察最基础的二叉链表建立,值得注意的一点是这道题输入形式是以广义表的格式输入,因此创建的函数有些不同
创建二叉树函数:
void CreateBiTree(BiTree* p)
{
char c, s;
(*p) = (BiTree)malloc(sizeof(BiTNode));//申请空间初始化
c = getchar();
s = c;
c = getchar();
(*p)->LChild = NULL;
(*p)->RChild = NULL;
if (s == ',')//如果,出现说明该节点是上一个节点的右子树
{
(*p)->data = c;
s = getchar();
if (s == '(')//(出现说明要开辟新的子节点
{
CreateBiTree(&((*p)->LChild));
CreateBiTree(&((*p)->RChild));
}
}
else //没有,说明后面要创建新的子树
{
(*p)->data = s;
if (c == '(')
{
CreateBiTree(&((*p)->LChild));
CreateBiTree(&((*p)->RChild));
}
}
}
基本思路是假设输入的节点为x
如果出现“,x”的情况,说明x是上一个节点的右节点;
如果出现x前没有“,",说明是左节点或者根节点;
剩下要说的都在注释里了话不多说上代码
#include<stdio.h>
#include <stdlib.h>
#define ok 1
#define error 0
#define max 1000
typedef struct Node
{
char data;
struct Node* LChild;
struct Node* RChild;
}BiTNode,*BiTree;
//构建二叉树
void CreateBiTree(BiTree* p)
{
char c, s;
(*p) = (BiTree)malloc(sizeof(BiTNode));//申请空间初始化
c = getchar();
s = c;
c = getchar();
(*p)->LChild = NULL;
(*p)->RChild = NULL;
if (s == ',')//如果,出现说明该节点是上一个节点的右子树
{
(*p)->data = c;
s = getchar();
if (s == '(')//(出现说明要开辟新的子节点
{
CreateBiTree(&((*p)->LChild));
CreateBiTree(&((*p)->RChild));
}
}
else //没有,说明后面要创建新的子树
{
(*p)->data = s;
if (c == '(')
{
CreateBiTree(&((*p)->LChild));
CreateBiTree(&((*p)->RChild));
}
}
}
void visit(char c)//这里要求遍历操作是输出节点的值,将visit函数独立还可以通过修改visit函数实现其他操作
{
printf("%c", c);
}
void PreOrder(BiTree root)//先序遍历二叉树
{
if (root != NULL)
{
visit(root->data);
PreOrder(root->LChild);
PreOrder(root->RChild);
}
}
int main()
{
BiTree p;
CreateBiTree(&p);
PreOrder(p);
return 0;
}
/*