利用後序和中序遍歷恢復二叉樹

2021-09-02 01:24:11 字數 3198 閱讀 4716

利用後序和中序遍歷可以將二叉樹還原出來,以便於進行其他樹的操作。在這裡我們還原出二叉樹之後進行先序遍歷來求得先序遍歷的結果,我們約定還原樹的函式叫做restoretree()。

過程

後序遍歷例項:c b e h g i f d a

中序遍歷例項:b c a e d g h f i

中序遍歷開始位置,結束位置記做z1,z2,後序的記為h1,h2

新建一顆空樹,左右孩子置空

拿到後序遍歷的最後乙個結點,其位置為z2,將該值存入樹的資料域

在中序遍歷的序列中以遍歷的方式找到最後乙個結點的位置,記為i

如果i!=z1,說明以該結點為根結點的樹有左子樹,以遞迴的方式,呼叫當前函式恢復左子樹

如果i!=z2,說明以該結點為根結點的樹有右子樹,以遞迴的方式呼叫當前函式恢復右子樹

返回樹的根結點值

需要注意的地方

在恢復左右子樹的時候,其位置需要算出來,即h1,h2和z1,z2的值需要重新計算,並在更新之後傳遞給restoretree()函式。以構建左子樹為例,左子樹的首元素下標為z1,最後乙個元素下標為i-1,對應的h1的值為h1,h2的值為h1+(i-z1-1),也就是h1當前的位置向前移動i-z1-1個長度。

**實現

以實現之前提到的字母序列為例

#include

#include

typedef

struct bitree

*bitree,bitnode;

bitree createtree

(void);

bitree restoretree

(int h1,

int h2,

int z1,

int z2)

;void

preorder

(bitree bt)

;char in[50]

,post[50]

;int

main

(void

)bitree createtree

(void

)bitree restoretree

(int h1,

int h2,

int z1,

int z2)

}return bt;

}void

preorder

(bitree bt)

由於**在恢復樹的時候先恢復的根結點,然後訪問的左右子樹,因此,恢復的過程也相當於乙個先根遍歷的過程.如果只想求先根遍歷,可以不建樹.我們可以刪掉先根遍歷的函式,同時簡化一些其他的語句.修改後的**如下:

#include

typedef

struct bitree

*bitree,bitnode;

void

restoretree

(int h1,

int h2,

int z1,

int z2)

;char in[50]

,post[50]

;int

main

(void

)void

restoretree

(int h1,

int h2,

int z1,

int z2)

}}

兩段**得到的結果是一樣的,以下是樣例輸入:

9

cbehgifda

bcaedghfi

以下是輸出:

a b c d e f g h i
**拓展

在這裡補充一段利用先序遍歷和中序遍歷來還原二叉樹並進行後序遍歷的**。

#include

#include

typedef

struct bitreebitnode,

*bitree;

void

postorder

(bitree bt)

;bitree restoretree

(char

* pre,

char

* in,

int q1,

int q2,

int z1,

int z2)

;int

main()

,in[10]

=;bitree bt=

restoretree

(pre,in,0,

6,0,

6);postorder

(bt)

;return0;

}bitree restoretree

(char

* pre,

char

* in,

int q1,

int q2,

int z1,

int z2)

}return bt;

}void

postorder

(bitree bt)

**和之前一樣可以簡化,簡化以後,不需要建樹,也可以進行後序遍歷。

#include

#include

typedef

struct bitreebitnode,

*bitree;

bitree restoretree

(char

* pre,

char

* in,

int q1,

int q2,

int z1,

int z2)

;int

main()

,in[10]

=;restoretree

(pre,in,0,

6,0,

6);return0;

}bitree restoretree

(char

* pre,

char

* in,

int q1,

int q2,

int z1,

int z2)

}printf

("%c"

,pre[q1]);

}

利用中序 後序 恢復二叉樹

要恢復乙個二叉樹,必須要有乙個中序。利用後序得到根,再根據中序將樹分成左右兩份。然後遞迴地呼叫即可。注意 此 未對後序與中序的字串有效性進行檢查。includeusing namespace std struct node node reconstruct const char postorder,...

前序中序,後序中序,層次遍歷和中序恢復二叉樹

typedef struct btnode btnode btnode createbt1 char pre,char in,int l1,int r1,int l2,int r2 前序和中序遍歷 s lchild createbt1 pre,in,l1 1,l1 i l2,l2,i 1 s rch...

中序遍歷和後序遍歷樹構造二叉樹

根據中序遍歷和後序遍歷樹構造二叉樹 樣例 1 輸入 輸出 解釋 二叉樹為空樣例 2 輸入 1,2,3 1,3,2 輸出 解釋 二叉樹如下 2 1 3你可以假設樹中不存在相同數值的節點 definition of treenode class treenode class solution int p...