二叉樹構建的各種方法

2021-10-03 19:22:40 字數 3990 閱讀 4368

花了幾分鐘把之前做的二叉樹的建樹模板總結了一下,都是很精煉的。

根據先序中序建樹,或者根據中序後序建樹。

用結構體指標建樹的兩種方式

不管是根據先序中序,還是中序後序幾種方法都可以

用每段長度模擬

核心是根據前序或者後序的根找到中序根的位置,然後對兩邊分開模擬

const

int maxn=

1e2+

5,inf=

0x3f3f3f3f

;typedef

long

long ll;

ll g[maxn]

[maxn]

,pre[maxn]

;typedef

struct node *node;

struct node

;ll zx[maxn]

,xx[maxn]

,f=1

;node create

(ll zx[

],ll xx[

],ll len));

ll i=0;

while

(zx[i++

]!=xx[0]

);t-

>lf=

create

(zx,xx+

1,i-1)

; t-

>rf=

create

(zx+i,xx+i,len-i)

;return t;

}}

node create

(ll hx[

],ll zx[

],ll len));

ll i=0;

while

(zx[i++

]!=hx[len-1]

);t-

>lf=

create

(hx,zx,i-1)

; t-

>rf=

create

(hx+i-

1,zx+i,len-i)

;return t;

}}

用每段的位置模擬

核心是根據前序或者後序的根找到中序根的位置,然後對兩邊分開模擬

const

int maxn=

1e2+

5,inf=

0x3f3f3f3f

;typedef

long

long ll;

ll g[maxn]

[maxn]

,pre[maxn]

;typedef

struct node *node;

struct node

;ll zx[maxn]

,xx[maxn]

,f=1

;node create

(ll inl,ll inr,ll firl,ll firr));

ll i=1;

while

(zx[i]

!=xx[firl]

) i++

; ll len=i-inl;

t->lf=

create

(inl,i-

1,firl+

1,firl+len)

; t-

>rf=

create

(i+1

,inr,firl+len+

1,firr)

;return t;

}

node create

(ll postl,ll postr,ll inl,ll inr));

ll i=0;

while

(zx[i]

!=hx[postr]

) i++

; ll num=i-inl;

t->lf=

create

(postl,postl+num-

1,inl,i-1)

; t-

>rf=

create

(postl+num,postr-

1,i+

1,inr)

;return t;

}}

用陣列模擬層序遍歷

vector<

int>in,pre,

level

(1000000,-

1);void

levelorder

(int root,

int start,

int end,

int index)

用陣列模擬某序遍歷

vector<

int>in,pre,

level

(1000000,-

1);void

levelorder

(int root,

int start,

int end)

用陣列模擬二叉搜尋樹

// idx 需要從 1 開始

void

build

(int idx,

int x)

平衡二叉樹

#include

#define rep(i,a,b) for(ll i=(a);i<=(b);++i)

#define per(i,a,b) for(ll i=(a);i>=(b);--i)

#define pb push_back

using

namespace std;

typedef

long

long ll;

const

int maxn=

1e5+5;

typedef

struct node *node;

struct node

;ll gh

(node t)

}node turnleft

(node t)

node turnright

(node t)

node turnleftright

(node t)

node turnrightleft

(node t)

node insert

(node t,ll x));

else

}else}}

return t;

}int

main()

cout << t-

>val;

return0;

}

根據二叉搜尋樹構建平衡二叉樹

#include

using

namespace std;

static

const

int maxn=

1e5;

typedef

struct node *node;

struct node

;int a[maxn]

,cnt=0;

void

dfs(node t)

}node build

(int l,

int r));

t->lf=

build

(l,mid-1)

; t-

>rf=

build

(mid+

1,r)

;return t;

}int

main()

構建二叉樹 遍歷二叉樹

陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...

構建二叉樹

前序遍歷構建二叉樹是根據根節點 左節點 右節點的方式輸入資料,針對乙個節點來說,首先輸入的是根節點,根節點之後的數值應該是其左子節點,之後是右節點,如果是遞迴,則首先是一直設定左節點,之後再依次設定右節點。之前在看二叉樹過程中,見過最多的是輸入個位數字構建二叉樹,今天看到乙個可以輸入多個數字的輸入方...

二叉樹的構建

二叉樹包括順序儲存和鏈式儲存,這裡只說鏈式儲存,二叉樹的每個結點和雙鏈表有些類似,但是數的結構要比雙鏈表複雜,在構造樹的過程中涉及到遞迴呼叫的問題,遞迴的問題往往是很複雜的問題,因此,這裡單獨說二叉樹的構建。include include include 定義二叉樹 typedef struct n...