花了幾分鐘把之前做的二叉樹的建樹模板總結了一下,都是很精煉的。
根據先序中序建樹,或者根據中序後序建樹。
用結構體指標建樹的兩種方式
不管是根據先序中序,還是中序後序幾種方法都可以用每段長度模擬
核心是根據前序或者後序的根找到中序根的位置,然後對兩邊分開模擬
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...