洛谷 P1030 求先序排列--- 二叉树问题---已知中后序补全二叉树求先序----C++

65 篇文章 1 订阅
6 篇文章 0 订阅

之前还写过一篇

二叉树问题—已知先中序补全二叉树求深度

正题

题目描述

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度 ≤8)。

输入格式

2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。

输出格式

1行,表示一棵二叉树的先序。

输入输出样例

输入 #1

BADC
BDCA

输出 #1

ABCD

题目分析

1.后续的最后一个永远是根节点,是谁的根要你自己判断
2.每一棵子树的中序和后序长度必定相等
3.当序列长度为1时,便是根

下面我会在用到以上要点的地方标注
核心代码

void InsertTree(NODE &root,string in_str,string post_str) {
	root = createNode(post_str[post_str.length() - 1]);//1
	int root_index = in_str.find(root->data);
	string lin_str = in_str.substr(0, root_index);
	string rin_str = in_str.substr(root_index + 1);
	string lpost_str = post_str.substr(0, lin_str.length());//2
	string rpost_str = post_str.substr(lin_str.length(),rin_str.length());	//2
	if (lin_str.length() == 1) root->lnode = createNode(lin_str[0]);//3
	else if (lin_str.length()) InsertTree(root->lnode, lin_str, lpost_str);
	if (rin_str.length() == 1) root->rnode = createNode(rin_str[0]);//3
	else if (rin_str.length())InsertTree(root->rnode, rin_str, rpost_str);
}

全部代码

#include<iostream>
#include<string>
#include<cstdlib>

using namespace std;

typedef struct Node{
	char data;
	Node* lnode;
	Node* rnode;
}Node,*NODE;

NODE createNode(char data) {
	NODE node = (NODE)malloc(sizeof(Node));
	node->data = data;
	node->lnode = node->rnode = NULL;
	return node;
}

void InsertTree(NODE &root,string in_str,string post_str) {
	root = createNode(post_str[post_str.length() - 1]);
	int root_index = in_str.find(root->data);
	string lin_str = in_str.substr(0, root_index);
	string rin_str = in_str.substr(root_index + 1);
	string lpost_str = post_str.substr(0, lin_str.length());
	string rpost_str = post_str.substr(lin_str.length(),rin_str.length());
	if (lin_str.length() == 1) root->lnode = createNode(lin_str[0]);
	else if (lin_str.length()) InsertTree(root->lnode, lin_str, lpost_str);
	if (rin_str.length() == 1) root->rnode = createNode(rin_str[0]);
	else if (rin_str.length())InsertTree(root->rnode, rin_str, rpost_str);
}

void PreOrder(NODE root) {
	if (root) {
		cout << root->data;
		PreOrder(root->lnode);
		PreOrder(root->rnode);
	}
}

int main() {
	NODE root;
	string in_str;
	string post_str;
	cin >> in_str >> post_str;
	InsertTree(root, in_str, post_str);
	PreOrder(root);
	cout << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值