实验目的:
设计一个二叉链表的程序,实现二叉链表存储的二叉树的数据结构,并完成二叉树的基础运算。
实验要求:
1、二叉链表的结点数据结构为
typedef char datatype;
typedef struct node * pointer;
struct node {
datatype data;
pointer lchild,rchild;
};
typedef pointer bitree; //二叉树根节点
2、初始化二叉树init(BT):置BT为空树
3、求双亲parent(BT, x):求二叉树BT中结点x的双亲结点
4、求左孩子lchild(BT, x)、右孩子rchild(BT, x):求BT中结点x的左孩子和右孩子
5、前序遍历traversePreorder(BT):按前序次序依次访问二叉树BT中每个结点,并是每个结点都被访问且仅被访问一次
6、用前序、中序序列生成二叉树prein_create(datatype Pre[],int ps, int pe,datatype In[], int is,int ie)(参考课本P104)
7、删除树deleteTree(BT):按前序次序依次删除BT树种的各结点
输入
程序启动后,依次input的信息如下:
1、按前序次序输入二叉树BT的各结点
2、按中序次序输入二叉树BT的各结点
3、输入字符x,查找值为x的结点的父结点
(若父结点不存在,则输出“no parent result”)
4、输入字符x,查找值为x的结点的左孩子和右孩子
(若左孩子不存在,则输出“no lchild result”,若右孩子不存在,则输出“no rchild result”)
输出
完成上述所有输入信息后,程序依次output的信息如下:
1、输出x结点的父节点(若父结点不存在,则输出“no parent result”)
2、输出x结点的左孩子(若左孩子不存在,则输出“no lchild result”)
3、输出x结点的右孩子(若右孩子不存在,则输出“no rchild result”)
4、按前序次序依次输出BT树的各结点(最后一个结点输出后,带一个空格,例如“A B H F D E C K G ”)
5、按前序次序,依次输出BT树被删除的各结点数值(最后一个结点输出后,带一个空格,例如“A B H F D E C K G”)
输入样例 1
ABHFDECKG
HBDFAEKCG
H
D
输出样例 1
B
no lchild result
no rchild result
A B H F D E C K G
A B H F D E C K G
输入样例 2
ABDEFCGHI
DBFEAGCHI
C
C
输出样例 2
A
G
H
A B D E F C G H I
A B D E F C G H I
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include <iostream>
#include <sstream>
#include <string.h>
using namespace std;
typedef char datatype;
typedef struct node * pointer;
struct node {
datatype data;
pointer lchild,rchild;
};
typedef pointer bitree; //二叉树根节点
static int count = 0;
bitree creatStree(char preArr[], int preStart, int preEnd,char midArr[] , int midStart ,int midEnd){
bitree t;
int i;
if(preStart > preEnd){
return NULL;
}
t = (bitree)malloc(sizeof(struct node));
t->data = preArr[preStart];
i = midStart;
while(midArr[i] != preArr[preStart]){
i++;
}
t->lchild = creatStree(preArr , preStart + 1, preStart + i - midStart,midArr ,midStart ,i - 1);
t->rchild = creatStree(preArr , preStart + i - midStart + 1, preEnd ,midArr ,i + 1 , midEnd);
return t;
}
//二叉树初始化
bitree init(bitree stree){
stree->data = NULL;
string preStr,midStr;
getline(cin , preStr);
getline(cin , midStr);
int preLen = preStr.size(), midLen = midStr.size();
char preArr[50], midArr[50];
strcpy(preArr,preStr.c_str());
strcpy(midArr,midStr.c_str());
bitree bit = creatStree(preArr,0,preStr.size() - 1, midArr, 0 , midStr.size() - 1);
return bit;
}
//求双亲parent(BT, x):求二叉树BT中结点x的双亲结点
void parent(bitree stree,datatype data){
pointer t = stree;
if(t == NULL){
return ;
}
if(t->lchild != NULL){
if(t->lchild->data == data){
printf("%c\n",t->data);
count++;
}
}
if(t->rchild != NULL){
if(t->rchild->data == data){
printf("%c\n",t->data);
count++;
}
}
parent(t->lchild,data);
parent(t->rchild,data);
}
//输出x结点的左孩子(若左孩子不存在,则输出“no lchild result”)
//输出x结点的右孩子(若右孩子不存在,则输出“no rchild result”)
void findChild(bitree stree,datatype data){
bitree t = stree;
if(stree == NULL){
return ;
}
if(t->data == data){
if(t->lchild == NULL){
printf("no lchild result\n");
}else{
printf("%c\n",t->lchild->data);
}
if(t->rchild == NULL){
printf("no rchild result\n");
}else{
printf("%c\n",t->rchild->data);
}
return ;
}
findChild(t->lchild,data);
findChild(t->rchild,data);
}
void preorder(bitree stree){
bitree t = stree;
if(t == NULL){
return ;
}
printf("%c ",t->data);
preorder(t->lchild);
preorder(t->rchild);
}
int main(){
bitree stree = (bitree)malloc(sizeof(struct node));
stree = init(stree);
char ch1, ch2;
cin >> ch1;
cin >> ch2;
parent(stree,ch1);
if(count == 0){
printf("no parent result\n");
}
findChild(stree,ch2);
preorder(stree);
printf("\n");
preorder(stree);
printf("\n");
return 0;
}