练习4.1 根据后序和中序遍历输出先序遍历 (25 point(s)) 笔记

练习4.1 根据后序和中序遍历输出先序遍历 (25 point(s))

原题链接
吐槽一下,找bug 找了快2个小时我的天,就只是因为一个地方打多了一个等号……我就说为什么会找不到序列里的元素……太菜了,可能写太急了结果得不偿失
给出accept代码

#include<stdio.h>
#include<iostream>
using namespace std;
const int Maxsize = 10010;
int Frontorder[Maxsize] = { 0 };
int Midorder[Maxsize] = { 0 };
int index = 0;
class TreeNode {
public:
	int data;
	TreeNode *left;
	TreeNode *right;
	TreeNode() {
		this->data = -1;
		this->left = NULL;
		this->right = NULL;
	}
};
void builtTree(TreeNode *tree,int Midstart,int Midend,int Frontstart,int Frontend) {
	if (Frontend < Frontstart)
		return;
	tree->data = Frontorder[Frontend];
	int ans = 0;
	for (int i = Midstart; i <= Midend; i++) {
		if (tree->data == Midorder[i])
			ans = i;
	}
	tree->left = new TreeNode();
	tree->right = new TreeNode(); 
	builtTree(tree->left, Midstart, ans - 1, Frontstart, Frontstart + ans - 1 - Midstart);
	builtTree(tree->right, ans + 1, Midend, Frontstart + ans - Midstart, Frontend - 1);
}
void result(TreeNode* tree,int number) {
	if (tree->data == -1 || tree == NULL)
		return;
	cout << tree->data;
	if (index < number-1) {
		cout << " ";
		index++;
	}
	result(tree->left,number);
	result(tree->right,number); 
}
int main() {
	int number;
	cin >> number;
	TreeNode* tree = new TreeNode();
	for (int i = 0; i < number; i++) {
		cin >> Frontorder[i]; 
	}
	for (int i = 0; i < number; i++) {
		cin >> Midorder[i];
	}
	builtTree(tree, 0, number - 1, 0, number - 1);
	cout << "Preorder: ";
	result(tree,number); 
	return 0;
}

我讲讲主要思路,其实不难。别像我那样犯一些弱智错误应该是没有什么地方会卡住的。

基本思路

  1. 建立树类啦之类的,输入之类的,带过,刷过pat都懂的老套路了。可能我写类的风格不太好,凑活看吧。
  2. 然后就是把题目中的树还原出来可以不还原树直接输出,思路和这个差不了多少,找到根节点输出就好像可以了
    • 后序的最后一个点必为根结点,存进进树的根节点。
    • 初始化树的左右儿子。
    • 在中序中寻找根节点的下标。
    • 建左树。把中序根节点的左边和后序的左树序列传递进去递归。
    • 建右树。把中序根节点的右边和后序的右树序列传递进去递归。
    • 结束条件为后序序列结尾的下标比开头的小。
  3. 输出答案,按前序。记得答案前面要加一个单词叫==preorder:。

心得

我好像不是第一次犯写少符号这种错了,我也想知道原因,想办法再专注点,毕竟这是粗心犯错。

Roman wasn’t built in a day . Just do it .

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值