二叉樹 根據二叉樹遍歷序列構造二叉樹

2021-07-10 02:59:36 字數 3215 閱讀 8228

二叉樹的節點型別宣告如下:

struct btnode ;
定理1任何(n>=0)個不同節點的二叉樹,都可由它的前序序列和中序序列唯一地確定。

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

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

void createbt1(btnode* &t, string pre, string

in)

char nodeval = pre[0];

int index = in.find(nodeval);

string lin = in.substr(0,index);

string rin = in.substr(index+1);

int leftchildlength = lin.length();

string lpre = pre.substr(1,leftchildlength);

string rpre = pre.substr(leftchildlength+1);

t = new btnode(nodeval);

createbt1(t->left,lpre,lin);

createbt1(t->right,rpre,rin);

}

定理2任何(n>=0)個不同節點的二叉樹,都可由它的中序序列和後序序列唯一地確定。

構造過程類似,演算法如下:

//根據中序遍歷序列和後序遍歷序列構造二叉樹

void createbt2(btnode* &t, string

in, string post)

char nodeval = post[len-1];

int index = in.find(nodeval);

string lin = in.substr(0,index);

string rin = in.substr(index+1);

int leftchildlength = lin.length();

int rightchildlength = rin.length();

string lpost = post.substr(0,leftchildlength);

string rpost = post.substr(leftchildlength,rightchildlength);

t = new btnode(nodeval);

createbt2(t->left,lin,lpost);

createbt2(t->right,rin,rpost);

}

#include

#include

#include

using

namespace

std;

struct btnode

};//根據前序遍歷序列和中序遍歷序列構造二叉樹

void createbt1(btnode* &t, string pre, string in)

char nodeval = pre[0];

int index = in.find(nodeval);

string lin = in.substr(0,index);

string rin = in.substr(index+1);

int leftchildlength = lin.length();

string lpre = pre.substr(1,leftchildlength);

string rpre = pre.substr(leftchildlength+1);

t = new btnode(nodeval);

createbt1(t->left,lpre,lin);

createbt1(t->right,rpre,rin);

}//根據中序遍歷序列和後序遍歷序列構造二叉樹

void createbt2(btnode* &t, string in, string post)

char nodeval = post[len-1];

int index = in.find(nodeval);

string lin = in.substr(0,index);

string rin = in.substr(index+1);

int leftchildlength = lin.length();

int rightchildlength = rin.length();

string lpost = post.substr(0,leftchildlength);

string rpost = post.substr(leftchildlength,rightchildlength);

t = new btnode(nodeval);

createbt2(t->left,lin,lpost);

createbt2(t->right,rin,rpost);

}//前序遍歷(遞迴)

void preorder(btnode *root)

}//中序遍歷(遞迴)

void inorder(btnode *root)

}//後序遍歷(遞迴)

void postorder(btnode *root)

} //測試用例

int main()

執行結果如下:

二叉樹 根據遍歷構造二叉樹

二叉樹中的三種遍歷方式,是我們最為熟知的,通過先序遍歷 中序遍歷或者是中序遍歷 後序遍歷都可以唯一確定一棵二叉樹 但是注意,先序遍歷 後序遍歷不能確定一棵二叉樹,但是如果一棵二叉樹中只有度為0和度為2的節點,那麼這種遍歷方式也是可以確定一棵確定的二叉樹的。先序 中序 構造二叉樹 下面我們分別來看一下...

二叉樹 根據序列建樹

include include using namespace std typedef struct node btnode 最好先在稿紙上寫出a0.ak,ak 1.an 1的序列,找到左右子樹的起點和終點 void create btnode t,char pre,char in,int n n為...

二叉樹 二叉樹遍歷 根據先序建立二叉樹

題目描述 編乙個程式,讀入使用者輸入的一串先序遍歷字串,根據此字串建立乙個二叉樹 以指標方式儲存 例如如下的先序遍歷字串 abc de g f 其中 表示的是空格,空格字元代表空樹。建立起此二叉樹以後,再對二叉樹進行中序遍歷,輸出遍歷結輸入 輸入包括1行字串,長度不超過100。輸出 可能有多組測試資...