前序遍歷和中序遍歷構造二叉樹 C語言資料結構

2021-08-10 08:27:49 字數 1616 閱讀 1021

由前序遍歷和中序遍歷構造一顆唯一的二叉樹的方法和思想都差不多,只是實現方式,呼叫函式等有所區別。

根據前序遍歷的特點, 知前序序列(pres)的首個元素(prese[0])為二叉樹的根(root),  然後在中序序列(ins)中查詢此根(root),  根據中序遍歷特點, 知在查詢到的根(root) 前邊的序列為根的左子樹的中序遍歷序列,  後邊的序列為根的右子樹的中序遍歷序列。 設在中序遍歷序列(ins)根前邊有left個元素. 則在前序序列

(pres)

中, 緊跟著根(root)的left個元素序列(即pres[1...left]) 為根的左子樹的前序遍歷序列, 在後邊的為根的右子樹的前序遍歷序列.而構造左子樹問題其實跟構造整個二叉樹問題一樣,只是此時前序序列為pres[1...left]), 中序序列為ins[0...left-1], 分別為原序列的子串, 構造右子樹同樣, 顯然可以用遞迴方法解決。(引自

//結構體定義

typedef struct node

bitreenode;

函式**如下:

bitreenode *maketree(char *pres, char *ins)  //引數為前序遍歷和後序遍歷的字串

//重要:遞迴結束條件

p->data=*ptr;//將前序遍歷的第乙個字元賦值給當前節點的data

int n=ptr-ins;//計算中序遍歷中「根」之前有幾個字元

char insleft[100];//定義左子樹前序遍歷字串

strncpy(insleft, ins, n);//利用strncpy函式將中序遍歷中「根」之前的字元(有n個)都賦值給insleft

insleft[n]='\0';

char *insright=++ptr;//定義左子樹中序遍歷字串並賦值

char presleft[100];//定義右子樹前序遍歷字串

pres++;

strncpy(presleft,pres,n);//利用strncpy函式將中序遍歷中「根」之前的字元(有n個)都賦值給

presleft

presleft[n]='\0';

char *presright=pres+n;//定義右子樹中序遍歷字串並賦值

p->leftchild= maketree(presleft,insleft);//利用遞迴,maketree(presleft,insleft)返回值為左子樹的根節點(當前結點的左孩子)

p->rightchild=maketree(presright,insright);

return p;//當前節點的三個資料都已賦值,返回當前節點

}

利用前序遍歷和中序遍歷構造二叉樹

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 920 157 思想 利用分治的思想來解決該題 具體解題步驟 1.根據先序遍歷,我們可...

根據前序遍歷和中序遍歷樹構造二叉樹

根據前序遍歷和中序遍歷樹構造二叉樹.樣例給出中序遍歷 1,2,3 和前序遍歷 2,1,3 返回如下的樹 2 1 3 假設樹中不存在相同數值的節點 definition of treenode class treenode class solution treenode helper vector p...

根據二叉樹的前序遍歷和中序遍歷構造二叉樹

題 給出某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列pre 和中序遍歷序列in 則重建二叉樹並返回。思路 令pi pre 0 由二叉樹的前序遍歷特性可知pi為二叉樹的根節點root,遍歷in,得到in j pi的下標...