二叉樹建樹的若干問題

2021-08-16 04:04:10 字數 1582 閱讀 3844

問題1二叉樹有一種問題很經典,如果給出中序遍歷和前序遍歷的序列,如何建立乙個顆二叉樹數?(實際上後續遍歷和前序遍歷是一樣的,可以替換掉前序遍歷的)

那麼我們容易知道,前序遍歷序列的第乙個節點就是root,那麼我們在中序遍歷找出這個點,那麼在這個點的左邊就是左子樹的中序遍歷序列,右邊亦然,那麼前序遍歷在除掉第乙個點以後與左子樹的中序遍歷序列相同數量相對應,構成乙個規模縮小,但是問題一致的子問題,所以很顯然,這個是可以遞迴解決的,遞迴的關鍵是就是中序遍歷序列和前序遍歷序列要有乙個對應。

這個很容易就可以想明白。

**

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

struct node

;int pre[1000];

int in[1000];

node *root;

node* findd(int l,int r,int l,int r)//l到r是中序序列,l到r是前序序列

int main()

問題2如何通過中序遍歷和層序遍歷重建二叉樹?

這個問題如果人工操作的話也應該是可以想明白的,那**怎麼寫?

就是我們是怎麼知道乙個點是否有左右的字節點?假設從層序遍歷開始,那麼易知第乙個便是根節點(root),那麼我在中序中去找這個節點,如果這個點左右兩邊都有點,那麼我們就可以知道root左右兩邊都有孩子,

所以我們應該不斷的去尋找根節點,然後判斷是否有左右孩子,在**尋找孩子?需要我們提供區間,那麼根節點的尋找就應當根據廣搜的這種形式,所以這個問題應該用bfs解決。

**

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

#define mod 1000000007

using

namespace

std;

struct node

;int layer[1000];

int in[1000];

node *root;

struct node2

;//佇列中存放的單位

int main()

if(mid//說明這個節點有右兒子

}return

0;}

思考:易知無論是前序後續還是層序,本質上就是提供根節點(相對而言)無論如何我們至少是需要中序遍歷,以此來得到左右子樹。

以上問題沒有具體的題目,所寫的**均為個人理解,如果有更加優化的寫法,歡迎指出。

如果還有遇到有趣的相關問題,下次再更新|·ω・`)

二叉樹建樹

給出前序和中序建樹 node build int n,int pre,int in 給出中序和後序建樹 node build int n,int in,int pos uva 548 給你一棵樹的中序和後序遍歷,求從根到葉子組成的路徑中數字和最小的那條,輸出最小路徑的葉子。思路 在重建完二叉樹後,d...

二叉樹建樹 遍歷

首先需要乙個結構體,表示每乙個結點 typedef struct node btnode 然後就可以直接建樹了 示例是按前序遍歷 關於前序遍歷後面有解釋 建樹 void build btnode t t data data t lchild null t rchild null build t lc...

二叉樹建樹的過程

include using namespace std 二叉樹建樹的過程 struct tree tree creat tree root else return root tree build int ps,int is,int n tree t new tree t data preorder ...