這種題一般有二種形式,共同點是都已知中序序列。如果沒有中序序列,是無法唯一確定一棵樹的。
<1>已知二叉樹的前序序列和中序序列,求解樹。
1、確定樹的根節點。樹根是當前樹中所有元素在前序遍歷中最先出現的元素。
2、求解樹的子樹。找出根節點在中序遍歷中的位置,根左邊的所有元素就是左子樹,根右邊的所有元素就是右子樹。若根節點左邊或右邊為空,則該方向子樹為空;若根節點
邊和右邊都為空,則根節點已經為葉子節點。
3、遞迴求解樹。將左子樹和右子樹分別看成一棵二叉樹,重複1、2、3步,直到所有的節點完成定位。
<2>、已知二叉樹的後序序列和中序序列,求解樹。
1、確定樹的根。樹根是當前樹中所有元素在後序遍歷中最後出現的元素。
2、求解樹的子樹。找出根節點在中序遍歷中的位置,根左邊的所有元素就是左子樹,根右邊的所有元素就是右子樹。若根節點左邊或右邊為空,則該方向子樹為空;若根節點
邊和右邊都為空,則根節點已經為葉子節點。
3、遞迴求解樹。將左子樹和右子樹分別看成一棵二叉樹,重複1、2、3步,直到所有的節點完成定位。
測試用例:
<1>先序 中序 求 後序
輸入:先序序列:abcdegf
中序序列:cbegdfa
輸出後序:cgefdba
**:
/*
preindex: 前序序列字串中子樹的第乙個節點在prearray中的下標
inindex: 中序序列字串中子樹的第乙個節點在inarray中的下標
subtreelen: 子樹的字串序列的長度
prearray: 先序序列陣列
inarray:中序序列陣列
*/void preincreatetree(bitree &t,int preindex,int inindex,int subtreelen)
else
}
主函式呼叫:
bitree t;
preincreatetree(t,0,0,strlen(inarray));
postorder(t);
另一種演算法:
/*
pres 先序序列的第乙個元素下標
pree 先序序列的最後乙個元素下標
ins 中序序列的第乙個元素下標
ine 先序序列的最後乙個元素下標
prearray 先序序列陣列
inarray 中序序列陣列
*/void preincreatetree(bitree &t,int pres ,int pree ,int ins ,int ine)
} //根結點的左子樹不為空
if(rootindex != ins)
else
//根結點的右子樹不為空
if(rootindex != ine)
else
}
主函式呼叫:
preincreatetree(t,0,strlen(prearray)-1,0,strlen(inarray)-1);
<2>中序 後序 求先序
輸入:中序序列:cbegdfa
後序序列:cgefdba
輸出先序:abcdegf
**:
/*
postindex: 後序序列字串中子樹的最後乙個節點在prearray中的下標
inindex: 中序序列字串中子樹的第乙個節點在inarray中的下標
subtreelen: 子樹的字串序列的長度
postarray: 後序序列陣列
inarray:中序序列陣列
*/void postincreatetree(bitree &t,int postindex,int inindex,int subtreelen)
else
}
主函式呼叫:
bitree t2;
postincreatetree(t2,strlen(postarray) - 1,0,strlen(inarray));
preorder(t2);
完整**:
#include#includeusing namespace std;
//二叉樹結點
typedef struct bitnodebitnode,*bitree;
//先序序列
char prearray[101] = "abcdegf";
//中序序列
char inarray[101] = "cbegdfa";
//後序序列
char postarray[101] = "cgefdba";
/* preindex: 前序序列字串中子樹的第乙個節點在prearray中的下標
inindex: 中序序列字串中子樹的第乙個節點在inarray中的下標
subtreelen: 子樹的字串序列的長度
prearray: 先序序列陣列
inarray:中序序列陣列
*/void preincreatetree(bitree &t,int preindex,int inindex,int subtreelen)
else}/*
postindex: 後序序列字串中子樹的最後乙個節點在prearray中的下標
inindex: 中序序列字串中子樹的第乙個節點在inarray中的下標
subtreelen: 子樹的字串序列的長度
postarray: 後序序列陣列
inarray:中序序列陣列
*/void postincreatetree(bitree &t,int postindex,int inindex,int subtreelen)
else
}//先序遍歷
void preorder(bitree t)
} //後序遍歷
void postorder(bitree t)
} int main()
二叉樹 已知前序 中序或中序 後序構造樹
一 已知二叉樹的中序和後序序列,求二叉樹的前序序列。如 中序 dbgeafc 後序 dgebfca後序的最後一位就是二叉樹的根節點,再根據根節點在中序序列裡的位置,可知道左右子樹,遞迴求解。include include include char pre 1500 用字串儲存前序序列 int k v...
二叉樹知道前序 中序求後序序列
思路 根據前序性質,每一顆子樹的前序第乙個節點永遠是其根節點 後序也有類似性質,所以知道後序中序求前序是乙個道理 根據中序性質,在中序序列中,某節點之前的節點全在其左邊,反之在其右邊。那麼我們在前序序列中找到當前樹根節點時,再在中序序列中找到樹根節點的位置,那麼知道中序序列中,在根節點以前的節點都是...
二叉樹遍歷(前序,中序,後序
二叉樹的遍歷有三種方式,如下 1 前序遍歷 dlr 首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。簡記根 左 右。2 中序遍歷 ldr 首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。簡記左 根 右。3 後序遍歷 lrd 首先遍歷左子樹,然後遍歷右子樹,最後訪問根結點。簡記左 右 根。例1 如上圖...