caioj1034:递归4(二叉树的后序遍历)

本文介绍了二叉树的后序遍历,包括遍历的逻辑和字符串子串的概念。作者强调了在处理子串时的细节,并提到在处理二叉树节点时的注意事项。此外,分享了一道相关题目及其代码实现。
摘要由CSDN通过智能技术生成

【闲话】暑假第一期课马神讲过这题...当时应该还是认真听认真写了的 现在不难理解

1.n序遍历就是123中根在n的位置 剩余左右填(emmm可能就我看得懂吧/doge

2.字符串子串s.substr(n,p)是从s的第n位开始长度为p的子串(第一位为0)总理解错s1.substr(1,p),s2.substr(0,p)以为是1到p和0到p还奇怪为什么前序中序不一样长

3.注意-> node*&root

emmm关于悬挂指针存疑 网上的看不懂qwq

【题意】

    二叉树是每个内部结点最多只有两个子结点且两个子结点有序的树。如下图就是一棵二叉树:

    对于一棵二叉树,有三种基本遍历方式:
    1.前序遍历:先访问根结点,然后再前序遍历左子树,最后前序遍历右子树;
    2.中序遍历:先中序遍历左子树,然后访问根结点,最后中序遍历右子树;
    3.后序遍历:先后序遍历左子树,然后后序遍历右子树,最后访问根结点。
    对于上图,前序遍历的结果是ABDEHCFGI。中序遍历的结果是DBEHAFCIG,后序遍历的结果是DHEBFIGCA。
    现在给出二叉树的前序和中序遍历,请输出相应的后序遍历。
【输入格式】
    第一行前序遍历的结果
    第二行中序遍历的结果
    都是大写字母,且结点的标识不重复,最多只有100个结点。
【输出格式】
    输出后序遍历的结果
【输入样例】
ABDEHCFGI
DBEHAFCIG
【输出样例】

DHEBFIGCA

【代码】

#include<iostream>
#include<string>
using namespace std;
struct node{
	char data;
	node *lch,*rch;
};

void create(string s1,string s2,node *&root){
	if(s1==""){
		root =NULL;
		return;
	}
	root =new node;//root=new(node);
	root->data =s1[0];
	int len=s1.size() ,p;//字符串中第一个字符的索引为 0
	p=s2.find(s1[0]);//从指定位置开始,并具有指定长度的子字符串
	create(s1.substr(1,p) ,s2.substr(0,p),root->lch  );
	create(s1.substr(p+1,len-p-1),s2.substr(p+1,len-p-1),root->rch  );
} 
void lastord(node *root){//此处root不会改变函数外的root 
	if(root){
		lastord(root->lch );
		lastord(root->rch );
		cout<<root->data ;
	}
} 

int main(){
	string s1,s2;
	node *root(NULL);//root 为空时悬挂指针? 
	cin>>s1>>s2;
	create(s1,s2,root);
	lastord(root);
	cout<<endl; 
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值