1. 程式人生 > >根據二叉樹的先序和中序遍歷,求出其後序遍歷序列

根據二叉樹的先序和中序遍歷,求出其後序遍歷序列

    新手,摸索著前進.......

這次用一個動態分配記憶體的方法,關於記憶體那方面,我也不是很懂,不過能執行也是超級開心的,哈哈

由先序序列和中序序列可以唯一確定一棵二叉樹,演算法實現步驟如下:

1)根據先序序列確定樹的根結點

2)根據根結點在中序序列中的位置劃分出二叉樹的左右子樹包含哪些結點。

    然後根據左、右字數結點在先序序列中的次序可以確定子樹的根結點,即回到步驟 1)。

如此重複上述步驟,直到每棵子樹僅有一個結點(該子樹的根結點)為止。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OVERFLOW 0
typedef struct Node
{
    char data;
    struct Node *lchild,*rchild;
    //Node(){data = 0;lchild = rchild = NULL;}
}Node,*BiTree;

char PreString[30],InString[30];//先序和中序遍歷字串

BiTree Build(char *PreString,char *InString,int s1,int e1,int s2,int e2)
{
//    BiTree T = (BiTree)malloc(sizeof(Node));
//    if(T == NULL)
//    {
//        exit(OVERFLOW);
//    }
    BiTree T = new Node();
    T -> data = PreString[s1];
    int rootIdx;//根結點所在序號
    for(int i = s2;i <= e2;i++)
    {
        if(PreString[s1] == InString[i])
        {
            rootIdx = i;
            break;
        }
    }
    int llen = rootIdx - s2;
    int rlen = e2 - rootIdx;
    if(llen != 0)
    {
        T -> lchild = new Node();
        T -> lchild = Build(PreString,InString,s1 + 1,s1 + llen,s2,s2 + llen - 1);
    }
    else
        T -> lchild = NULL;
    if(rlen != 0)
    {
        T -> rchild = new Node();
        T -> rchild = Build(PreString,InString,e1 - rlen + 1,e1,e2 - rlen + 1,e2);
    }
    else
    {
        T -> rchild = NULL;
    }
    return T;
}

void PostOrder(BiTree T)//後序遍歷
{
    if(T != NULL)
    {
        PostOrder(T -> lchild);
        PostOrder(T -> rchild);
        printf("%c",T -> data);
    }
}

int main()
{
    printf("請輸入先序遍歷字串:");
    scanf("%s",PreString);
    printf("請輸入中序遍歷字串:");
    scanf("%s",InString);
    BiTree T = NULL;
    T = Build(PreString,InString,0,strlen(PreString)-1,0,strlen(InString)-1);
    printf("此二叉樹的後序遍歷為:");
    PostOrder(T);
    printf("\n");
    return 0;
}

相關推薦

根據其後序列

    新手,摸索著前進.......這次用一個動態分配記憶體的方法,關於記憶體那方面,我也不是很懂,不過能執行也是超級開心的,哈哈由先序序列和中序序列可以唯一確定一棵二叉樹,演算法實現步驟如下:1)根據先序序列確定樹的根結點2)根據根結點在中序序列中的位置劃分出二叉樹的左右

根據結果其後

首先我們先複習下不同類別的遍歷: 先序遍歷:遍歷二叉樹時先遍歷根節點,然後遍歷其左子樹,最後遍歷右子樹。 中序遍歷:先遍歷其左子樹,然後遍歷根節點,最後遍歷右子樹。 後續遍歷:先遍歷左子樹,然後遍歷右子樹,最後遍歷根節點。 假如給定二叉樹的先序1,2,4,7,3,5,6,8,和中序4,7,2,1,5,3,8

根據序列輸出後

#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> using namespac

根據序列的方法

已知二叉樹的先序和中序序列如下: 先序序列:1 2 4 6 3 5 7 8 中序序列:2 6 4 1 7 5 8 3 請畫出該二叉樹。 答: 先序序列的遍歷順序是先根節點,後左孩子,最後右孩子 中序序列的遍歷順序是先左孩子,後根節點,最後右孩子 根

logs __main__ font class pre span 思想 style 輸出 實現一個功能: 輸入:一顆二叉樹的先序和中序遍歷 輸出:後續遍歷思想: 先序遍歷中,第一個元素是樹根 在中序遍歷中找到樹根,左邊的是左子樹 右邊的是右子樹

二叉樹 com size 基本 html 後序 href col spa 轉自:https://www.cnblogs.com/polly333/p/4740355.html 基本思想>>   先序遍歷:根——>左——>右   先序遍歷:左——>

數據結構 遞歸非遞歸方式實現

nor post 後序遍歷 order else 對象 二叉樹先序 bre print   二叉樹的先序遍歷順序是根、左、右;中序遍歷順序是左、根、右;後序遍歷順序是左、右、根。   遞歸方式實現如下: 1 public class TreeNode { 2

(拼多多筆試演算法)根據的前確定後的兩種思路

根據二叉樹的前序遍歷和中序遍歷確定後序遍歷 輸入:第一行:結點數目 第二行:前序遍歷陣列 第三行:中序遍歷陣列 輸出 :後序遍歷陣列 例如:第一行:7 第二行:6 4 2 5 3 1 7 第三行:4 2 5 6 1 3 7 輸出 :5 2 4 1 7 3 6 我思

根據的前或者後來確定結構(附例題)

根據中序和前序後序中的任意一種結構就可以確定二叉樹的結構。 因為中序是按照左中右的順序來遍歷的。而前序是按照中左右的順序來確定的,我們可以通過按照前序順序來構建二叉樹,通過中序來確定二叉樹的左子樹和右子樹。後序和中序組合也是這樣,只不過後序需要從後面開始找。 這裡給出兩個例題: 1.前序

3.1分別用遞迴非遞迴方式實現

題目 用遞迴和非遞迴方式,分別按照二叉樹先序、中序和後序列印所有的節點。 首先給出二叉樹節點結構定義: public class BinaryTreeNode { //二叉樹節點 private int data; private Bi

根據序列求解後的演算法

問題模型:已知某二叉樹前序遍歷序列為1,2,3,4,5,6,中序遍歷為3,2,4,1,6,5,設計程式計算後序序列。 關於這個問題你可以通過前序遍歷和中序遍歷建立一顆樹,然後通過後序遍歷進行求解,當然還可以直接根據已知兩序列直接推理後序序列,本文將對這種分析進行介紹。 利用

根據還原

P:終點時要明白二叉樹的幾種遍歷方法以及規律; 先序:中左右。 中序:左中右。 後序:左右中。 上面的左右皆為中的子樹,所以優勢具有二叉樹的特性,那麼我們就可以遞迴還原樹了; 這裡是一個二叉樹還原及求深度。 /*******************************

根據結果輸出結果

題目描述 編一個程式,讀入使用者輸入的一串先序遍歷字串,根據此字串建立一個二叉樹(以指標方式儲存)。 例如如下的先序遍歷字串: ABC##DE#G##F### 其中“#”表示的是空格,空格字元代表空樹。建立起此二叉樹以後,再對二叉樹進行中序遍歷,輸出遍歷結果。 輸入描述:

根據序列後續序列還原一顆

 資料結構作業 採用C++完成 /**題目要求 已知二叉樹的中序遍歷序列 char ino[]以及後序遍歷序列char pst[],請用演算法生成該二叉樹(用二叉連結串列的形式儲存)*/ #include<stdio.h> #include<stdlib.

根據的前串演算法

如果是根據中序結果和前序或後序的話,得出的結果應該是唯一的,而且也比較簡單 但是根據前序和後序,求中序結果就有多種可能了,難度有點大,之前百度了一下沒找到相關部落格文章指導,那就自己琢磨寫一個把 下面是我自己寫的求中序的演算法: public clas

根據的前構建的c語言完整程式碼

//重建二叉樹:輸入某二叉樹的前序和中序遍歷,重建出該二叉樹 #include<stdio.h> #include<malloc.h> typedef struct binarytreenode { int value; struct

根據的前

在面試的過程中,發現有幾家公司都喜歡考這樣的一道題,就是在一棵二叉樹中,已知這棵二叉樹的前序和中序遍歷結果,要求寫出後序遍歷結果。 例如:在一棵二叉樹總,前序遍歷結果為:ABDGCEFH,中序遍歷結果為:DGBAECHF,求後序遍歷結果。 我們知道: 前序遍歷方式為:根節點-

鏈式 、後 (遞迴、非遞迴)

參考部落格:click here! 鏈式二叉樹儲存結構: typedef int DataType; typedef struct BiNode { DataType data; struct BiNode *lc, *rc; // 左右子節點指標 int depth; } B

Leetcode-----遞迴非遞迴

中序遍歷二叉樹 題目連結:中序遍歷二叉樹 解法一: 遞迴遍歷比較簡單 public List<Integer> inorderTraversal(TreeNode root) { List<Integer> result = new ArrayLi

、後的遞迴演算法與非遞迴演算法

首先是二叉樹資料結構的定義: typedef struct TNode *Position; typedef Position BinTree; /* 二叉樹型別 */ struct TNode{ /* 樹結點定義 */ int Data; /* 結點資料 */ BinTre