数据结构 二叉树 已知前序中序遍历求后续遍历的递归实现

代码很短,实现起来也很简单,下面是代码:

//
//  main.cpp
//  PreMidgetPost
//
//  Created by xin wang on 4/29/15.
//  Copyright (c) 2015 xin wang. All rights reserved.
//

#include <iostream>

//链表二叉树的节点类
template <class T>
class BinaryTreeNode{
    public:
    BinaryTreeNode(){LeftChild = RightChild=0;}
    BinaryTreeNode(const T& e){
        data=e;
        LeftChild=RightChild =0;
    }
    BinaryTreeNode(const T& e,BinaryTreeNode *l,BinaryTreeNode *r){
        data = e;
        LeftChild =l;
        RightChild =r;
    }
    T data;
    BinaryTreeNode<T> *LeftChild,*RightChild;
};

//定义一个数组,分别装前序遍历和中序遍历的数组
int pre_order[100];
int mid_order[100];

BinaryTreeNode<int> *translate(int pre_l,int pre_r,int mid_l,int mid_r){

    if (pre_r-pre_l<0) {//
        return 0;
    }
    BinaryTreeNode<int> *root;//new一个root节点
    root= new BinaryTreeNode<int>;
    root->data=pre_order[pre_l];//前序遍历的第一个节点是跟节点
    std::cout<<root->data<<"root"<<std::endl;
    if (pre_r==pre_l) {//如果两者相等,说明只有一个树节点
        root->LeftChild=NULL;
        root->RightChild=NULL;
        return root;
    }
    int index;//找到中序遍历中跟节点所在的位置
    for (index = mid_l; index<=mid_r; index++) {
        if (mid_order[index] == pre_order[pre_l]) {
            break;
        }

    }
    root->LeftChild = translate(pre_l+1, pre_l+(index-mid_l), mid_l, index-1);//递归找到跟节点的左孩子的值
    root->RightChild= translate(pre_l+(index-mid_l)+1,pre_r , index+1, mid_r);//递归找到根节点右孩子的值
    return root;
}

//将后序遍历打印出来
void post_Order(BinaryTreeNode<int> *root){
    if(root){
        post_Order(root->LeftChild);
        post_Order(root->RightChild);
        std::cout<<"值"<<root->data<<std::endl;
    }
}

int main(int argc, const char * argv[]) {
    int in=0;
    std::cout<<"请输入数组的长度:"<<std::endl;
    std::cin>>in;
    std::cout<<"请输入数组前序"<<std::endl;
    int zu;
    int bb=0;
    int num=0;
    while (bb<in) {

        std::cin>>zu;
        pre_order[num]=zu;
        num++;
        bb=bb+1;
    }
    std::cout<<"请输入数组的中序"<<std::endl;
    int zuzhong;
    int numzhong=0;
    int aa=0;
    while(aa<in){
        std::cin>>zuzhong;
        mid_order[numzhong]=zuzhong;
        numzhong++;
        aa=aa+1;
    }

    BinaryTreeNode<int> *root = translate(0, in-1, 0, in-1);

    std::cout<<"后序遍历"<<std::endl;

    post_Order(root);
    return 0;
}
时间: 2025-01-19 23:31:56

数据结构 二叉树 已知前序中序遍历求后续遍历的递归实现的相关文章

HDU 1710Binary Tree Traversals(已知前序中序,求后序的二叉树遍历)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1710 解题思路:可以由先序和中序的性质得到 : 先序的第一个借点肯定是当前子树的根结点, 那么在 中序中找到这个结点, 则这个结点左边的节点属于左子树, 右边的属于右子树.然后递归遍历就可以了. 样例: 9 1 2 4 7 3 5 8 9 6 4 7 2 1 8 5 9 3 6 7 4 2 8 9 5 6 3 1 如图: 因此,用深搜就能轻松解决了,注意DFS中的变量,以及向清楚DFS的条件,这题就

已知前序中序求后序-二叉树

writer:pprp 思路很容易理解,但是实现还是有一点难度,容易错 参考书目:<算法竞赛宝典> 代码如下: //已知前序中序,求后序 #include <iostream> using namespace std; //a是前序,b是中序 void hwg(string a,string b) { int ll,lr; for(unsigned int i = 0; i < b.length(); i++) { if(a[0] == b[i]) //找到根节点 { ll

已知前序中序,重建二叉树,输出后序

具体算法就是用前序的第一个字母(根节点)去中序查找该字母,把中序分成前后2节,前一节是左子树,长度len_l,后一节是右子树,长度len_r.且前序字符串的长度也可以根据前序分析得到的长度len_l和len_r分成这样的2节.接着递归构建. 如://前序序列 "ABDHLEKCFG"; //中序序列 "HLDBEKAFCG"; 1. 用A去中序序列查找,将其分为HLDBEK和FCG,左子树的长度为6,右子树长度为3.2. 把前序序列从A之后根据上句的左右子树的长度分

【已知前序中序二叉树求后序二叉树】

int PreOrder[1000], InOrder[1000]; int flag, n; typedef struct BiTNode { int data; struct BiTNode *LChild, RChild; } BiTNode, *BiTree; void PostOrderTraverse(BiTree T) { if(T == NULL) return ; PostOrderTraverse(T -> LChild); PostOrderTraverse(T -> R

华南理工数据结构大作业第二题 二叉树各种操作深度结点个数后序前序中序层次求祖先

/*#include<iostream> #include<windows.h> using namespace std ; struct BTNode { char data ; BTNode *left ; BTNode *right ; BTNode () { left = NULL ; right = NULL ; } } ; int main () { cout <<"题目所给的二叉树用括号表示法后表示为:A(B(D,E(H(J,K(L,M(,N))

已知一棵树的前序中序,求后序

poj 2225 #include<iostream> #include<fstream> #include<set> #include<stack> #include<cmath> #include<cstring> #include<cstdio> #include<queue> #include<stdlib.h> using namespace std; typedef long long

[无需建树]已知前序或后序和中序遍历结果,输出前序或后序或层次遍历的方法汇总

最近刷PAT老是碰到这种憨批题目,这种题目在算法面试中也是常客了,主要分为4类 已知前序 中序,求后序 已知前序 中序,求层次 已知后序 中序,求前序 已知前序 中序,求层次 而这四种题目如果要做出来的话,通通不需要建树,因为建树也是按照一定的递归顺序来的,就算是层次遍历,也可以在递归途中保存一些信息来获得. 我们先给出一颗二叉树 可以得到以下信息 前序:4,1,3,2,6,5,7 中序:1,2,3,4,5,6,7 后序:2,3,1,5,7,6,4 层次:4,1,6,3,5,7,2 前序&中序-

二叉树的前序中序后序遍历相互求法

二叉树的前中后序遍历,他们的递归非递归.还有广度遍历,参见二叉树的前中后序遍历迭代&广度遍历和二叉树的前中后序遍历简单的递归 现在记录已知二叉树的前序中序后序遍历的两个,求另外一个.一般,这两个中一定有中序遍历. 1.已知前序和中序,求后序遍历: 前序:ABDECFG  中序:DBEAFCG 思路简单:前序的第一个节点就是根节点, 中序中找到根节点的位置,根节点之前是其左子树,之后是右子树   按此顺序,依次在左子树部分遍历,右子树部分遍历 C++ 代码: TreeNode *BinaryTre

已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)

1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列的第一个字母肯定就是根节点,即A是根节点:然后,由于中序遍历先访问左子树,再访问根节点,最后访问右子树,所以我们找到中序遍历中A的位置,然后A左边的字母就是左子树了,也就是CBD是根节点的左子树:同样的,得到EF为根节点的右子树. 将前序遍历序列分成BCD和EF,分别对左子树和右子树应用同样的方法,