給定一棵二叉樹的前序遍歷和後序遍歷,給出一種可能的中序遍歷結果。
從檔案input.txt中讀入序列,結果輸出到output.txt;第一行是前序序列,第二行是後序序列,結點名稱用大寫字母表示,最多26個結點。
a b d c e
d b e c a
d b a e c
#include
#include
#include
#define maxn 27
char pre[maxn]
;char post[maxn]
;char mid[maxn];/*
將已知的前後序列分解,最小的序列只含有乙個元素
每次分解,可以確定當前序列根節點所在位置,並對分解後更小的序列進行遞迴。
*/void
findmid
(int l1,
int h1,
int l2,
int h2,
int l3,
int h3)
//分別為前後中序列的下標範圍
//如果只有1個元素,直接返回
for(i=l2;i<=h2&&post[i]
!=pre[l1+1]
;i++
)//如果不止乙個元素,那麼就搜尋post中等於pre[l1+1]元素的元素下標
int len1=i-l2+1;
//只有不止乙個元素時候才能用pre[l1+1],否則會出錯
int len2=h2-i-1;
mid[l3+len1]
=pre[l1]
;//確定位置
if(len1>0)
findmid
(l1+
1,l1+len1,l2,l2+len1-
1,l3,l3+len1-1)
;if(len2>0)
findmid
(h1-len2+
1,h1,h2-len2,h2-
1,h3-len2+
1,h3);}
intmain()
}while
((ch=
getchar()
)!=eof)
//最後一行用eof作為結束
}int n=
strlen
(pre)
;//得到字串長度,pre和post長度一樣,算乙個就行
findmid(0
,n-1,0
,n-1,0
,n-1);
//printf
("前序序列為:%s\n後序序列為:%s\n可能的中序序列為:%s"
,pre,post,mid)
;}
#include
#include
#include
#include
#include
/*getchar()的返回值是int型別,也就是將字元強制轉換成int,如果遇到檔案末尾就返回eof
*/using
namespace std;
typedef
struct node
node;
vector<
char
>pre,post;
node*
create
(int l1,
int h1,
int l2,
int h2)
int i;
for(i=l2;i
!=pre[l1+1]
;i++
)int llen=i-l2+1;
int rlen=h2-
1-i;
root-
>left=
create
(l1+
1,l1+llen,l2,l2+llen-1)
; root-
>right=
create
(h1-rlen+
1,h1,h2-rlen,h2-1)
;return root;
}void
midorder
(node *root)
}int
main()
while
(c=getchar()
,c!=
'\n'
&&c!=
eof)
node* root=
create(0
,pre.
size()
-1,0
,pre.
size()
-1);
midorder
(root)
;}
二叉樹,B樹,B 樹
先來看看二叉樹 二叉樹是大家熟知的一種樹,用它來做索引行不行,可以是可以,但有幾個問題 1.如果索引資料很多,樹的層次會很高 只有左右兩個子節點 資料量大時查詢還是會慢 2.二叉樹每個節點只儲存乙個記錄,一次查詢在樹上找的時候花費磁碟io次數較多 所以它並不適合直接拿來做索引儲存,演算法設計人員在二...
二叉樹的遍歷 二叉樹遍歷與儲存
在資料結構中,二叉樹是非常重要的結構。例如 資料庫中經常用到b 樹結構。那麼資料庫是如何去單個查詢或者範圍查詢?首先得理解二叉樹的幾種遍歷順序 先序 中序 後序 層次遍歷。先序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 按層級 class node if c...
構建二叉樹 遍歷二叉樹
陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...