概述
输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct BiNode
{
char data;
BiNode *lchild,*rchild;
};
void PostOrder(BiNode *root)
{
if(root==NULL) return ;
PostOrder(root->lchild);
PostOrder(root->rchild);
cout<<root->data;
}
int Search(char *pre,char *in,int len)
{
for(int i=0;i<len;i++)
if(pre[0]==in[i])
return i;
return -1;
}
BiNode *Build(char *pre,char *in,int len)//创建二叉树的过程
{
if(len<=0)return NULL;//空结点
BiNode *root=new BiNode;
int qj=Search(pre,in,len);
root->data=*pre;//每次都存前序遍历中区间内的第一个结点,即为根结点
//pre+1表示前序排列中左子树的根结点位置,in代表从in[0]开始为左子树,此处qj为左子树中结点总数。
root->lchild=Build(pre+1,in,qj);
//同理。第一个位置表示前序排列中右子树根结点的位置,第二个元素表示从in[in+qj+1]开始为右子树。len-1-qj表示右子树中结点的总数。1是当前根结点本身,qj表示左子树中的结点数。
root->rchild=Build(pre+qj+1,in+qj+1,len-1-qj);
return root;//将创建好的当前结点返回;
}
int main()
{
char *pre=new char[300],*in=new char [300];
cin>>pre;cin>>in;
BiNode *root=Build(pre,in,strlen(in));
PostOrder(root);
}
思路:先找根结点,通过比对前序和中序字符串,划分出左子树和右子树,重复找根结点+划分两个步骤,直至当前根结点为空。创建出孩子结构清楚的前序遍历。
具体实现:利用二叉链表的结点表示方法。存储根节点(最开始的前序遍历的第一个元素),找根结点在中序遍历中的位置,确定左子树的结点个数(即根结点在中序排列中的下标减去前序排列中的下标,差值即是),然后递归创建左子树,递归创建右子树,最后返回根结点。
注意:在中序排列中搜索子树根结点的位置时,是在子树所在的区间搜索的!
最后
以上就是从容鞋子为你收集整理的【Open Judge二叉树】04:二叉树的遍历问题的全部内容,希望文章能够帮你解决【Open Judge二叉树】04:二叉树的遍历问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复