#include <stdio.h>
#include <stdlib.h>
/*
定义顺序存储结构
*/
struct seqTree
{
int n;
char *root;
};
/*辅助功能:逐个输出顺序表的元素,元素之间以空格为界*/
void printTree(struct seqTree *T)
{
int i = 0;
while(i!=T->n){
printf("%c ",T->root[i]);
i++;
}
}
/*第一关*/
struct seqTree *createSeqTree()
{
//此处编写代码实现二叉树的初始化,包括输入数据
struct seqTree* tree = (struct seqTree*)malloc(sizeof(struct seqTree));
tree -> n = 0;
tree -> root = (char*)malloc(sizeof(char)*100);
scanf("%c",&tree->root[tree->n]);
while(tree->root[tree->n]!='\n'){
tree->n++;
scanf("%c",&tree->root[tree->n]);
}
return tree;
}
/*第二关,返回二叉树的根结点的值,若二叉树为空,则返回#*/
char root(struct seqTree *T)
{
if(T==NULL)return '#';
return T->root[0];
}
/*第二关,求二叉树T中指定结点ch的双亲结点,返回值是双亲结点的下标,若双亲不存在,则返回-1*/
int parent(struct seqTree *T ,char ch)
{
for(int i=0;i<T->n;i++){
if(T->root[i]==ch&&i!=0)return (i-1)/2;
}
return -1;
}
/*第二关,求二叉树T中指定结点ch的左孩子的下标,若左孩子不存在,则返回-1*/
int leftChild(struct seqTree *T ,char ch)
{
if(T==NULL) return -1;
for(int i=0;i<T->n;i++){
int temp = 2*i+1;
if(T->root[i]==ch&&T->root[temp]!=' ')
return temp;
}
return -1;
}
/*第二关,求二叉树T中指定结点ch的右孩子的下标,若左孩子不存在,则返回-1*/
int rightChild(struct seqTree *T ,char ch)
{
if(T==NULL)return -1;
for(int i=0;i<T->n;i++){
int temp = 2*i+2;
if(T->root[i]==ch&&T->root[temp]!=' '){
return temp;
}
}
return -1;
}
/*第三关:层序遍历二叉树,输出遍历得到的结点,结点之间不需要空格*/
void levelOrder(struct seqTree *T )
{
for(int i = 0;i<T->n;i++){
if(T->root[i]!=' ')printf("%c",T->root[i]);
}
}
///*第四关:先序遍历二叉树,输出遍历得到的结点,结点之间不需要空格*/
void MyPreOrder(struct seqTree *T,int index){
if(T==NULL)return;
if(T->root[index]!=' ') printf("%c",T->root[index]);
if(index<T->n){
MyPreOrder(T, index*2+1);
MyPreOrder(T, index*2+2);
}
}
void preOrder(struct seqTree *T )
{
MyPreOrder(T,0);
}
int main(void)
{
struct seqTree *T = createSeqTree();
//printTree(T); //测评第一关时,把本行代码放开
/* printf("%c\n",root(T)); // 测评第二关时,把该代码块放开
printf("%d\n",leftChild(T,'A'));
printf("%d\n",rightChild(T,'A'));
printf("%d\n",parent(T,'A'));
*/
//levelOrder(T); //测评第三关时,把本行代码放开
preOrder(T); //测评第四关时,把本行代码放开
}