【洛谷】P1030 求先序排列(二叉树)题解

原题链接:https://www.luogu.org/problem/P1030

题目描述

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


输入输出格式

输入格式:

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

输出格式:

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


输入输出样例

输入样例#1:

BADC
BDCA

输出样例#1:

ABCD


说明

时空限制:1000ms 125M


思路:
树的遍历方式:

  1. 先序遍历:先根节点后左右子树。
  2. 中序遍历:先左子树,再根节点,最后右子树。
  3. 后序遍历:先左右子树后根节点。

步骤:

  1. 先找到根节点并输出,即后序遍历的最后一点。
  2. 将中序遍历和后序遍历后的序列各分为两棵子树。
  3. 递归,重复一,二步骤,直到中序遍历后的长度小于等于0。

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; 
void tree(string s1,string s2){
	int len1=s1.size();	 
	int len2=s2.size();
	if(len1>0){	 
		char ch=s2[len2-1];	//根节点 
		cout<<ch;	//每次递归输出根节点 
		int pos=s1.find(ch);	//在s1中找到ch出现的位置 
		tree(s1.substr(0,pos),s2.substr(0,pos));	//递归左子树 
		tree(s1.substr(pos+1),s2.substr(pos,len1-pos-1));	//递归右子树 
	}
}
int main() {
	string str1,str2;
	cin>>str1>>str2;
	tree(str1,str2);	//构建左子树 
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要清空排叉树(Binary Search Tree,BST),可以执行以下步骤: 1. 创建一个函数,用于删除二叉树的节点。函数可以使用递归来实现。 2. 在删除函数中,首检查当前节点是否为空。如果为空,则返回。 3. 如果当前节点不为空,递归地调用删除函数来删除左子树和右子树。 4. 释放当前节点的内存。 5. 在主程中,调用删除函数,传入根节点来清空整个二叉树。 以下是一个示例代码,用于清空排叉树: ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* left; struct Node* right; }; // 创建新节点 struct Node* createNode(int data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } // 删除二叉树节点 struct Node* deleteTree(struct Node* node) { if (node == NULL) { return NULL; } // 递归地删除左子树和右子树 node->left = deleteTree(node->left); node->right = deleteTree(node->right); // 释放当前节点的内存 free(node); return NULL; } int main() { struct Node* root = createNode(5); root->left = createNode(3); root->right = createNode(8); root->left->left = createNode(2); root->left->right = createNode(4); root->right->left = createNode(6); root->right->right = createNode(9); // 清空二叉树 root = deleteTree(root); if (root == NULL) { printf("二叉树已清空\n"); } else { printf("二叉树清空失败\n"); } return 0; } ``` 上述代码中,我们创建了一个简单的排叉树,并使用 `deleteTree` 函数来清空它。最后,我们检查根节点是否为空来验证二叉树是否已经清空。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值