求二叉树的先序遍历

求二叉树的先序遍历

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

 已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历

输入

 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的中序遍历序列,第二个字符串表示二叉树的后序遍历序列。 

输出

 输出二叉树的先序遍历序列

示例输入

2
dbgeafc
dgebfca
lnixu
linux

示例输出

abdegcf

xnliu
代码:
#include<stdio.h>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
typedef char DATA_TYPE;
//typedef char DATA_TYPE;
typedef struct tagBINARY_TREE_NODE  BINARY_TREE_NODE, *LPBINARY_TREE_NODE;
//struct tagBINARY_TREE_NODE
struct tagBINARY_TREE_NODE
{
 DATA_TYPE   data; //节点数据??
 LPBINARY_TREE_NODE pLeftChild; //左孩子指针??
 LPBINARY_TREE_NODE pRightChild; //右孩子指针??
};
void TreeFromMidPost(LPBINARY_TREE_NODE & lpNode, string mid, string post, int lm, int rm, int lp, int rp)//string类型就是字符串数组
{
 //构造二叉树结点
 lpNode = new BINARY_TREE_NODE;
 lpNode->data = post[rp]; lpNode->pLeftChild = NULL;
 lpNode->pRightChild = NULL;

 int pos = lm;

 while (mid[pos] != post[rp])//中序的根=后序的根在末尾
 { pos++;//中序根的位置
 }
 int iLeftChildLen = pos - lm;//中序左孩子长度

 if (pos > lm)//有左孩子,递归构造左子树??
 {
 TreeFromMidPost(lpNode->pLeftChild, mid, post, lm, pos - 1, lp, lp + iLeftChildLen - 1);
 }

 if (pos < rm)//有右孩子,递归构造右子树??
 {
 TreeFromMidPost(lpNode->pRightChild, mid, post, pos + 1, rm, lp + iLeftChildLen, rp - 1);
 }
}
void PreOrder(LPBINARY_TREE_NODE p)
{
 if(p != NULL)
 {
 cout << p->data; //输出该结点
 PreOrder(p->pLeftChild);//遍历左子
 PreOrder(p->pRightChild); //遍历右子树
 }
}
void Release(LPBINARY_TREE_NODE lpNode)
{
 if(lpNode != NULL)
 {
 Release(lpNode->pLeftChild);
 Release(lpNode->pRightChild);
 delete lpNode;
 lpNode = NULL;
 }
}
int main(int argc, char* argv[])
{
 string pre;//存储先序序列??
 string mid; //存储中序序列??
 string post; //存储后序序列??
 int n;
 LPBINARY_TREE_NODE lpRoot; //二叉树根节点指针
scanf("%d",&n);
for(int i=0;i<n;i++)
{
    cin >> mid;
 cin >> post;

 TreeFromMidPost(lpRoot, mid, post, 0, mid.size()-1, 0, post.size()-1);
 //cout<<"先序遍历结果:";
 PreOrder(lpRoot);
 cout<<endl;
}

return 0;
}









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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值