1. 程式人生 > >二叉樹 已知中序 後序 求前序

二叉樹 已知中序 後序 求前序

題意:

給出一棵二叉樹的中序和後序遍歷,求它的前序遍歷。

程式碼如下:

#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <cstdlib>
using namespace std;
struct TNode
{
    char cInfo;
    TNode * pLeft;
    TNode * pRight;
};
#define NULL 0
#define LEN sizeof(TNode)
typedef TNode * pBTNode;
void vCreatTree(string sMidOrd,string sPostOrd,pBTNode pRoot)
{
    int nLen,nPos;
    char cData;
    string sMidOrd1,sMidOrd2,sPostOrd1,sPostOrd2;
    pBTNode pLSon,pRSon;
    nLen=sPostOrd.size();
    cData=sPostOrd[nLen-1];
    pRoot->cInfo=cData;
    pRoot->pLeft=NULL;
    pRoot->pRight=NULL;
    nPos=sMidOrd.find(cData);
    if(nLen>1)
    {
        if(nPos>0)
        {
            sMidOrd1=sMidOrd.substr(0,nPos);
            sPostOrd1=sPostOrd.substr(0,nPos);
            pLSon=(struct TNode *)malloc(LEN);
            pRoot->pLeft=pLSon;
            vCreatTree(sMidOrd1,sPostOrd1,pLSon);
        }
        if(nLen-1>nPos)
        {
            sMidOrd2=sMidOrd.substr(nPos+1,nLen-nPos-1);
            sPostOrd2=sPostOrd.substr(nPos,nLen-nPos-1);
            pRSon=(struct TNode *)malloc(LEN);
            pRoot->pRight=pRSon;
            vCreatTree(sMidOrd2,sPostOrd2,pRSon);
        }
    }
}
//獲得前序遍歷
string sGetPreOrd(pBTNode pRoot)
{
    string sRet;
    sRet="";
    if(pRoot!=NULL)
    {
        sRet+=pRoot->cInfo;
        sRet+=sGetPreOrd(pRoot->pLeft);
        sRet+=sGetPreOrd(pRoot->pRight);
    }
    return sRet;
}
// 刪除樹
void vDeleteTree(pBTNode pRoot)
{
    if(pRoot->pLeft!=NULL)
    {
        vDeleteTree(pRoot->pLeft);
        free(pRoot->pLeft);
        pRoot->pLeft=NULL;
    }
    if(pRoot->pRight!=NULL)
    {
        vDeleteTree(pRoot->pRight);
        free(pRoot->pRight);
        pRoot->pRight=NULL;
    }
}
//輸出
void vOutput(string sOut)
{
    cout << sOut << endl;
}
int main()
{
    string sMidOrd,sPostOrd,sPreOrd;
    pBTNode pRoot;
    while(cin >> sMidOrd >> sPostOrd)
    {
        pRoot=(struct TNode *)malloc(LEN);
        vCreatTree(sMidOrd,sPostOrd,pRoot);
        sPreOrd=sGetPreOrd(pRoot);
        vOutput(sPreOrd);
        //vDeleteTree(pRoot);
        free(pRoot);
    }
    return 0;
}
/*
DCFEAB
DFECBA
*/


相關推薦

題意: 給出一棵二叉樹的中序和後序遍歷,求它的前序遍歷。程式碼如下: #include <cstdio> #include <cstring> #include <string> #include <algorithm> #i

排列(

ostream ble sta EDA 題目 sam test c++ adc 問題 A: [2001_p3]求先序排列 時間限制: 1 Sec 內存限制: 125 MB提交: 90 解決: 73 題目描述 給出一棵二叉樹的中序與後序排列。求出它的先序排列

-兩種遍歷第三種

1,先序和中序,輸出後序 #include<iostream> #include<stack> using namespace std; const int N=1010; int n,pre[N],in[N]; //先序陣列和後序陣列 stack<int>

兩個序列,建立也有)

本文主要講二叉樹的建樹,具體的說就是,題目給出你二叉樹的前序和中序,你來建樹,還有一個題目是給出中序和後序來建樹 第一題:A binary tree is a finite set of vertices that is either empty or consists

遍歷序列

Tree描述Little Valentine liked playing with binary trees very much. Her favorite game was constructing

的非遞迴遍歷(非遞迴C語言)

前兩天做資料結構實驗,要求用非遞迴演算法遍歷二叉樹。只知道用棧來儲存資料,具體演算法還不太清楚。經過兩天的搜尋,看到網上很多種解法,很多解法都是用C++來寫的演算法,一直找不到用C語言寫的演算法,所以就總結了一下,用C寫出了一個遍歷二叉樹的三種非遞迴演算法。 前

的深度優先dfs遍歷(;遞迴與非遞迴)

//前序遍歷 //遞迴實現:根左右 void preOrder1(BinTree *root) { if (root != NULL) { cout<<root->data<<endl; preOrder1(root->lch

兩種遍歷序列 第三種遍歷序列

已知 前序和中序遍歷 求後序遍歷序列 struct node *creat(char *a, char *b, int n) { struct node *ptr; char

【資料結構】的鏈式儲存結構(通過序列和序列構造

說明:需要分別輸入要二叉樹的前序序列和中序序列才能構建二叉樹。如果構建失敗,程式會報錯。 比如我們給定一個二叉樹,容易知道 前序序列為:GDAFEMHZ 中序序列為:ADEFGHMZ 程式執行結果: 原始碼 #include<stdio.h> #

根絕的遍歷順序(+||+)還原詳解(轉)

最近做PAT遇到了還原二叉樹的問題,其實,這個演算法雖是基礎演算法,可是當真正比賽或者考試的時候不看模板還是不好寫的,因為遞迴的變數是要嚴格控制住的。 具體方法如下: 面試題目或多或少會出現這樣的選擇題或者簡答題: 首先我們得知道概念: 前序遍歷:先訪問當前節

一個按先序列輸入的字元序列,如abc,,de,g,,f,,,(其中逗號表示空節點)。請建立並按方式遍歷,最後出葉子節點個數和深度。

這是一個標準的模板題 記下了就完事了! Input   輸入一個長度小於50個字元的字串。 Output 輸出共有4行: 第1行輸出中序遍歷序列; 第2行輸出後序遍歷序列; 第3行輸出葉子節點個數; 第4行輸出二叉樹深度。 Sample Input abc,,

遍歷遍歷,及遍歷遍歷

#include<iostream> using namespace std; //已知二叉樹前序遍歷和中序遍歷,求後序遍歷 void binary_tree_postorder(char* preorder,char* inorder,int length){

遍歷和遍歷遍歷()

已知後序遍歷和中序遍歷重建二叉樹和已知前序遍歷和中序遍歷求後序遍歷的時候已經說明思路,這裡直接貼程式碼 # -*- coding:utf-8 -*- class Solution(object

的非遞迴遍歷(先和層遍歷)

[前文] 二叉樹的非遞迴遍歷有 先序遍歷、中序遍歷 、後續遍歷 和 層序遍歷。 非遞迴演算法實現的基本思路:使用堆疊。而層序遍歷的實現:使用佇列。 如下圖所示的二叉樹:      前序遍歷順序為:ABCDE  (先訪問根節點,然後先序遍歷其左子樹,最後先序遍歷

的建立,查詢,輸出,先遍歷 具體操作

//註釋改日補上。。。 #include<iostream> #include<cstdio> #include<cstdlib> #include<malloc.h> using namespace std; typedef

的基本操作實現(建立、先、層

[問題描述] 建立一棵二叉樹,試程式設計實現二叉樹的如下基本操作: 1. 按先序序列構造一棵二叉連結串列表示的二叉樹T; 2. 對這棵二叉樹進行遍歷:先序、中序、後序以及層次遍歷,分別輸出結點的遍歷序列;  [基本要求] 從鍵盤接受輸入(先序),以二叉連結串列作為儲存結

遍歷LeetCode#144 #94 #145 (遍歷)

題目:二叉樹的前序遍歷(遞迴以及非遞迴方法) 難度:Medium 思路:遞迴很簡單,非遞迴需要藉助棧來實現 程式碼: 遞迴程式碼 /** * Definition for a binary

模板 先遍歷,非遞迴演算法,層次遍歷,葉子結點數,深度

#include <iostream> #include<stdio.h> #include<malloc.h> #include<queue> #define MAX 50 using namespace std; type

連結串列建立一棵並進行前遍歷

原始碼:#include<iostream>using namespace std;typedef char Datatype;struct TNode{    Datatype data;    TNode* rchild;    TNode* lchild;}

為什麽總能線索化

思想 計算 編程 中序遍歷 發揮 合成 會有 二叉線索樹 整體 為什麽二叉樹為什麽總是可以按照中序遍歷線索化空指針是夠但怎麽保證不會有一個有左右孩子的節點不被別人指到想了想可以用類似於數學歸納法這樣證明: 先討論三種最簡單的情形 1. ab c b左指針