根据中序和先序遍历创建一颗二叉树☆

题目:设一个二叉树各节点的值互不相同,其先序遍历序列和中序遍历序列分别存于两个一维数组A、B中,试编写算法建立该二叉树的二叉链表
分析:
        这是一个典型的已知中序和先序求二叉树的案例,具体实现步骤如下:
        1、先根据先序序列确定树的根节点
        2、根据根节点在中序在中序序列中划分出二叉树的左右子树包含哪些节点,然后根据左右子树节点在先序序列中的次序确定子树的
        的根节点,即回到步骤一。
        如此重复,直到每科子树仅有一个节点为止。

代码如下:

struct biTree {
	char data;
	struct biTree *lchild;
	struct biTree *rchild;
};
#include <stdio.h>
#include <stdlib.h>
biTree *preInCreate(char *arrIn,char *arrPre,int l1,int h1,int l2,int h2) {
	//l1 h1 为中序的第一和最后一个节点下标,l2 h2 为先序的第一和最后一个节点
	int llen, rlen,i;//左子树、右子树长度
	struct biTree *root = (struct biTree *)malloc(sizeof(struct biTree));
	root->data = *(arrPre + l2);
	for (i = l1; *(arrIn + i) != root->data; i++);//找到根节点在中序序列的位置
	
	llen = i - l1;//记录左边节点个数
	rlen = h1 - i;//记录根节点右边节点个数
	if (llen) {
		root->lchild = preInCreate(arrIn,arrPre,l1,l1+llen-1,l2+1,l2+llen);//把左边的序列有看做一个新的继续找根节点
	}
	else {
		root->lchild = NULL;
	}
	if (rlen) {
		root->rchild = preInCreate(arrIn, arrPre, h1-llen+1, h1, h2-llen+1, h2);//把右边的序列有看做一个新的继续找根节点
	}
	else {
		root->rchild = NULL;
	}
	return root;
}
int main() {
	char arrIn[] = { 'D','B','E','A','F','C','G' }, arrPre[] = {'A','B','D','E','C','F','G'};
	struct biTree *root;
	void inOrder(biTree *);
	void preOrder(biTree *);
	root = preInCreate(arrIn,arrPre,0,6,0,6);
	inOrder(root);
	printf("\n");
	preOrder(root);

	return 0;
}

世界上唯一可以不劳而获的就是贫穷,唯一可以无中生有的是梦想,没有哪件事是不动手就可以实现的。世界虽残酷,但只要你愿意走,总会有路!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北街学长

你的鼓励使我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值