假設已知先序序列為pre1、pre2、······pren,中序序列為in1、in2、······inn,如圖所示:解題思路:根據先序序列和中序序列找到根節點,根據根節點劃分左子樹和右子樹的數目,然後再次遞迴進行建立左子樹與右子樹的結點。(不管是左子樹還是右子樹都遵循遍歷的原則)**實現//先序序列區間wie[prel,prer],中序序列區間為[inl,inr]
node*
create
(int prel,
int prer,
int inl,
int inr)
node* root=
new node;
//新建乙個結點,用來存放當前二叉樹的根節點
root-
>data=pre[prel]
;//新建結點的資料域為根節點的值
int k;
for(k=inl;k<=inr;k++)}
int numleft=k-inl;
//左子樹的結點個數
//左子樹的先序序列區間為[prel+1,prel+numleft],中序序列區間為[inl,k-1]
//返回左子樹的根節點位址,賦值給root的左指標
root-
>lchild==
create
(prel+
1,prel+numleft,inl,k-1)
;//右子樹的先序序列區間為[prel+numleft+1,prer],中序序列區間為[k+1,inr]
//返回右子樹的根節點位址,賦值給root的右指標
root-
>rchild==
create
(prel+numleft+
1,prer,k+
1,inr)
;return root;
//返回根節點位址
}
玩轉二叉樹 根據中序和先序輸出層次遍歷序列
給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裡假設鍵值都是互不相等的正整數。輸入第一行給出乙個正整數n 30 是二叉樹中結點的個數。第二行給出其中序遍歷序列。第三行給出其前序遍歷序列。數字間以空格分隔。在...
pat 還原二叉樹 根據後序中序輸出先序
還原二叉樹 25分 給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。輸入首先給出正整數n le 50 為樹中結點總數。下面兩行先後給出先序和中序遍歷序列,均是長度為n的不包含重複英文本母 區別大小寫 的字串。輸出為乙個整數,即該二叉樹的高度。9 abdfghiec fdhgibe...
先序中序重建二叉樹
includeusing namespace std vectorpre,in int p typedef struct node vectorpost int rec int l,int r 通過前序和後序得到樹 int main for int i 0 i tem in.push back te...