根据中序和层序建立二叉树

题目描述:给出一个N,表示结点数,然后第二行给出层序遍历,第三行给出中序遍历,求该树的前序遍历。样例:

7
3 5 4 2 6 7 1
2 5 3 6 4 7 1

首先我们可以根据层序的最前面的结点找到根结点,然后下一个结点所在的位置与中序中的位置有关。例如:由层序知根结点是3,然后5是3的子结点。因为在中序中5在3的左边,所以5是3的左结点。
在这里插入图片描述
然后层序的下一个结点是4,在中序中4在3的右边
在这里插入图片描述
下一个结点是2,中序中2在5的左边:
在这里插入图片描述
层序下一个是6,中序中6在3的右边,在4的左边:
在这里插入图片描述
接下来的两个也是相同的办法:
在这里插入图片描述
代码:

#include<cstdio>
#include<vector>
using namespace std;
struct node{
	int data;
	node * left, * right;
};
vector<int> level;
int pos[110], n; 
node * root = NULL;
node * create(int index, node * &root)
{
	if(root == NULL)
	{
		root = new node;
		root->left = root->right = NULL;
		root->data = level[index];
		return root;
	}
	if(pos[root->data] > pos[level[index]])
	create(index, root->left);
	else
	create(index, root->right);
	return root;
}
int cnt = 0;
void DFS(node * root)
{
	if(root == NULL)
	return;
	printf("%d", root->data);
	cnt++;
	if(cnt < n)
	printf(" ");
	DFS(root->left);
	DFS(root->right);
}
int main()
{
	scanf("%d", &n);
	level.resize(n+1);
	int num;
	for(int i = 1; i <= n; i++)
	scanf("%d", &level[i]);
	for(int i = 1; i <= n; i++)
	{
		scanf("%d", &num);
		pos[num] = i;
	}
	for(int i = 1; i <= n; i++)
	create(i, root);
	DFS(root);
}
  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
很高兴为您提供帮助!下面是 C 语言中基于前序和中序序列构建二叉树的代码: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 1000 // 定义数组最大容量 int preOrder[MAXSIZE], inOrder[MAXSIZE]; // 定义前序序列和中序序列 typedef struct BinaryTree { int data; struct BinaryTree *left; // 左子树指针 struct BinaryTree *right; // 右子树指针 }BTNode, *BiTree; // 通过前序和中序序列构建二叉树 BiTree BuildTree(int preBegin, int preEnd, int inBegin, int inEnd) { int i, j, rootValue; BiTree root; if (preBegin > preEnd || inBegin > inEnd) // 序列为空的情况 { return NULL; } rootValue = preOrder[preBegin]; // 根节点 root = (BiTree)malloc(sizeof(BTNode)); root->data = rootValue; for (i = inBegin; i <= inEnd; i++) // 找到根节点在中序序列中的位置 { if (inOrder[i] == rootValue) { break; } } int leftLen = i - inBegin; // 左子树长度 int rightLen = inEnd - i; // 右子树长度 root->left = BuildTree(preBegin + 1, preBegin + leftLen, inBegin, i - 1); // 递归构建左子树 root->right = BuildTree(preEnd - rightLen + 1, preEnd, i + 1, inEnd); // 递归构建右子树 return root; } // 输出后序序列 void postOrderTraversal(BiTree root) { if (root == NULL) // 如果遍历到为空的子树,直接返回 { return; } postOrderTraversal(root->left); // 递归输出左子树 postOrderTraversal(root->right); // 递归输出右子树 printf("%d ", root->data); // 输出根节点 } // 输出层序序列 void levelOrderTraversal(BiTree root) { BiTree queue[MAXSIZE]; int front = -1, rear = -1; // 初始化队头队尾指针 if (root == NULL) // 二叉树为空的情况 { return; } queue[++rear] = root; while (front != rear) { BiTree temp = queue[++front]; printf("%d ", temp->data); if (temp->left != NULL) { queue[++rear] = temp->left; } if (temp->right != NULL) { queue[++rear] = temp->right; } } } int main() { int n, i; // 输入节点数量 printf("请输入节点数量:"); scanf("%d", &n); // 输入前序和中序序列 printf("请输入前序序列:"); for (i = 0; i < n; i++) { scanf("%d", &preOrder[i]); } printf("请输入中序序列:"); for (i = 0; i < n; i++) { scanf("%d", &inOrder[i]); } BiTree root = BuildTree(0, n - 1, 0, n - 1); // 输出后序序列 printf("后序序列为:"); postOrderTraversal(root); printf("\n"); // 输出层序序列 printf("层序序列为:"); levelOrderTraversal(root); printf("\n"); return 0; } ``` 注意:由于涉及二叉树的建立,本代码不支持输入非法序列。如果输入的前序和中序序列无法构建二叉树,程序将崩溃或出现异常结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值