1. 程式人生 > >根據二叉樹先序和中序遍歷結果求其後序遍歷

根據二叉樹先序和中序遍歷結果求其後序遍歷

首先我們先複習下不同類別的遍歷:

先序遍歷:遍歷二叉樹時先遍歷根節點,然後遍歷其左子樹,最後遍歷右子樹。

中序遍歷:先遍歷其左子樹,然後遍歷根節點,最後遍歷右子樹。

後續遍歷:先遍歷左子樹,然後遍歷右子樹,最後遍歷根節點。

假如給定二叉樹的先序1,2,4,7,3,5,6,8,和中序4,7,2,1,5,3,8,6,求其後序遍歷結果

實現思路是首先構建二叉樹,然後後續遍歷輸出。

由上面的各種不同遍歷的定義我們知道,先序遍歷第一個元素為根節點,因此我們可以在中序序列中找到根節點的位置,而根據中序遍歷的定義,我們知道在中序序列中根節點元素左側的為左子樹,右側的為右子樹。因此可以知道,4、7、2為左子樹節點,5、3、8、6為右子樹節點。同理我們可以知道先序序列中第二個元素為左子樹的根,因此同樣可對左子樹節點進行劃分,在先序序列中去除佇列前左子樹節點後,即從第5個元素開始即為右子樹節點,且第五個即為其根節點。這樣遞迴的去進行劃分,直到左右子樹為空,為其指定左右孩子,然後依次返回。

以下為實現程式碼

#include<stdio.h>
#include<stdlib.h>

typedef int Elemtype;

typedef struct node
{
    Elemtype value;
    struct node *lchild;
    struct node *rchild;
}tree_node,*tree_pnode;

tree_pnode create_tree(Elemtype *pre_traverse,Elemtype* mid_traverse,int size)
{   
    if(size<=0)
        return NULL;
    int i = 0;
    for(i;i<size;i++)
        if(*(mid_traverse+i)==*pre_traverse)
                break;
    tree_pnode pnode = (tree_pnode)malloc(sizeof(tree_node));
   
    pnode->value = mid_traverse[i];
    
    pnode->lchild = create_tree(pre_traverse+1,mid_traverse,i);
    pnode->rchild = create_tree(pre_traverse+i+1,mid_traverse+i+1,size-i-1);
    
    return pnode;
}


void back_traverse(tree_pnode tree)
{
    tree_pnode current = tree;
    if(tree != NULL)
    {  
         back_traverse(tree->lchild);
         back_traverse(tree->rchild);
         printf("%d ",tree->value);
    }
}

int main()
{
    
    Elemtype pre_traverse[8] = {1,2,4,7,3,5,6,8},mid_traverse[8] = {4,7,2,1,5,3,8,6};

    tree_pnode tree = create_tree(pre_traverse,mid_traverse,8);
    printf("backtraverse\n");
    back_traverse(tree);
}

執行結果:7 4 2 5 8 6 3 1

相關推薦

根據結果其後

首先我們先複習下不同類別的遍歷: 先序遍歷:遍歷二叉樹時先遍歷根節點,然後遍歷其左子樹,最後遍歷右子樹。 中序遍歷:先遍歷其左子樹,然後遍歷根節點,最後遍歷右子樹。 後續遍歷:先遍歷左子樹,然後遍歷右子樹,最後遍歷根節點。 假如給定二叉樹的先序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)根據根結點在中序序列中的位置劃分出二叉樹的左右

根據序列畫出的方法

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

二叉樹 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

實現

一、遞迴實現 import java.util.*; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int