演算法之二叉樹中序前序序列 或後序 求解樹

2021-06-12 22:57:10 字數 3159 閱讀 4872

這種題一般有二種形式,共同點是都已知中序序列。如果沒有中序序列,是無法唯一確定一棵樹的。

<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 如上圖...