二叉树基础运算

实验目的:

设计一个二叉链表的程序,实现二叉链表存储的二叉树的数据结构,并完成二叉树的基础运算。

实验要求:

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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值