我是靠谱客的博主 从容鞋子,最近开发中收集的这篇文章主要介绍【Open Judge二叉树】04:二叉树的遍历问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。

#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:二叉树的遍历问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部