NOIP普及2001,求先序排列

本文介绍了如何根据二叉树的后序遍历和中序遍历序列来求解先序遍历序列。通过理解三种遍历方式的特点,特别是后序遍历最后一个节点为根节点,结合中序遍历序列,可以确定左右子树的划分,并递归求解。AC代码展示了具体的实现过程。
摘要由CSDN通过智能技术生成

【二叉树】求先序排列

传送门:求先序排列

  给定二叉树先序和中序求后序,和给定后序和中序求先序的问题是关于二叉树最基础的问题(蒟蒻刚刚学树),这三种遍历方法的不同与根节点的遍历顺序有关,都可以用递归实现:
  先序根遍历:先访问根节点,然后用先序根遍历访问左子树,最后用先序根遍历访问右子树
  中序根遍历:先用中序根遍历访问左子树,然后访问根节点,最后用中序根遍历访问右子树
  后续根遍历:先用后续根遍历访问左子树,然后用后序根遍历访问右子树,最后访问根节点
  这三种遍历方式是二叉树内容的基础的基础。这里不再赘述

  我们看回这道题,因为后序遍历的特性,后序遍历序列的最后一个节点就是这棵二叉树的根,知道根了以后,再来看中序遍历,因为中序遍历是先访问左子树,再是根,最后是右子树的,所以中序遍历序列以后序遍历序列的最后一个节点为界限,左侧的就是左子树的中序遍历序列,右边的就是右子树的中序遍历序列。那么怎么求出左子树和右子树的后序遍历序列呢?用中序序列我们可以求出左子树和右子树的节点数(也就是序列长度),然后后序序列的左侧是左子树,右边是右子树,那么我们知道长度,把后序序列的起始坐标加上左子树长度,这一段就是左子树的后序序列。然后就是先输出根,然后看左子树和右子树的长度,不是空就递归去输出它们(所以根本用不着建树?
  可能有点绕,但只要明白后序遍历的最后一个是根节点,在中序遍历找到根节点的位置,其左侧就是左子树,右侧是右子树。其它的就都是细节问题了~。

  贴出开始那道题的AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值