根據前序遍歷序列和中序遍歷序列構造二叉樹演算法

2021-08-08 04:00:01 字數 1753 閱讀 1643

乙個前序遍歷序列和乙個中序遍歷序列可以確定一顆唯一的二叉樹。

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

(presequence)

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

二叉樹的定義於下:

[cpp]view plain

copy

//二叉鍊錶表示二叉樹

typedef

struct

binode  

binode, * bitree;  

由前序遍歷序列和中序遍歷序列確定一顆唯一的二叉樹的演算法餘下:

[cpp]view plain

copy

//由前序序列和中序序列建立二叉樹的過程

void

createbitree(bitree & t,string presequence,string insequence)

//t為要建立的二叉樹,presequence和insequence分別為前序和中序序列

char

rootnode=presequence[0];

//根int

index=insequence.find(rootnode);

//根在中序序列中的位置

string lchild_insequence=insequence.substr(0,index);//左孩子的中序序列

string rchild_insequence=insequence.substr(index+1);//右孩子的中序序列

intlchild_length=lchild_insequence.length();

//左孩子的長度

intrchild_length=rchild_insequence.length();

//右孩子的長度

string lchild_presequence=presequence.substr(1,lchild_length);//左孩子的前序序列

string rchild_presequence=presequence.substr(1+lchild_length);//右孩子的前序序列

t=(bitree)malloc(sizeof

(binode));  

if(t!=null)  

}  

如何根據前序遍歷序列和中序遍歷序列確定二叉樹

分段,每一段找根節點,就好,找root,有點遞迴的思路。例如 假設某二叉樹的先序遍歷序列是abdgcefh,中序遍歷序列是dgbaechf,畫出二叉樹,並給出其後序遍歷序列.以下面的例題為例進行講 已知一棵二叉樹的先序遍歷序列和中序遍歷序列分別是abdgcefh dgbaechf,求二叉樹及後序遍歷...

根據前序遍歷序列和中序遍歷序列重建二叉樹

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。程式設計思路 1.先求出根節點 前序序列第乙個元素 2.將根節點帶入到中序遍歷序列中求出左右子樹的中序遍歷序列。3.通過左...

根據前序遍歷和中序遍歷得出後序遍歷

首先要明確前序,中序和後序的遍歷順序 前序 父節點,左子節點,右子節點 中序 左子節點,父節點,右子節點 後序 左子節點,右子結點,父節點 明確之後,首先根據前序遍歷,確定整個二叉樹的根節點 前序的第乙個節點 再通過中序遍歷,可以直接根據根節點將整個二叉樹分為左右兩顆子樹.這時再逐步根據前序和中序順...