根據先中序序列或後中序序列確定二叉樹

2021-06-26 02:35:16 字數 2615 閱讀 7719

/*

name: 根據先中序序列或後中序序列確定二叉樹 

author: 巧若拙 

date: 03-10-14 11:25

description: 

根據先中序序列或後中序序列確定二叉樹,各種順序遍歷二叉樹檢查結果。 

根據先中序序列生成二叉樹:從先序序列中找到二叉樹(或者子樹)的根結點,然後在中序序列找到該根結點,

根結點將中序序列分成左右兩部分,左邊為左子樹,右邊為右子樹。

根據中序序列確定左子樹的長度,確定左子樹中最右下結點在先序序列中的位置,

從而可以確定左右子樹在先中序序列中的範圍,然後遞迴的生成左右子樹。

根據後中序序列生成二叉樹:從後序序列中找到二叉樹(或者子樹)的根結點,然後在中序序列找到該根結點,

根結點將中序序列分成左右兩部分,左邊為左子樹,右邊為右子樹。

根據中序序列確定左子樹的長度,確定左子樹中最右下根結點在後序序列中的位置,

從而可以確定左右子樹在後中序序列中的範圍,然後遞迴的生成左右子樹。

*/#include

#include

#include

#include

#include

#define maxsize 100

#define ok 1

#define error 0

#define true 1

#define false 0 

#define link 0     //link:指標

#define thread 1   //thread:線索

typedef char elemtype;

typedef int status; //函式型別,其值是函式結果狀態**,如ok等 

typedef struct bitreenode bitreenode, *bitree;

void preorderprint(bitree p); //先序遍歷輸出結點(遞迴)

void inorderprint(bitree p); //中序遍歷輸出結點(遞迴)

void postorderprint(bitree p); //後序遍歷輸出結點(遞迴)

bitree bitreebypreind(elemtype pre, elemtype ind, int preleft, int preright, int indleft, int indright);//根據先序和中序序列生成一棵二叉樹

bitree bitreebypostind(elemtype post, elemtype ind, int postleft, int postright, int indleft, int indright);//根據後序和中序序列生成一棵二叉樹

int main(void)

bitree bitreebypreind(elemtype pre, elemtype ind, int preleft, int preright, int indleft, int indright)//根據先序和中序序列生成一棵二叉樹

head->data = pre[preleft];

root = indleft;

while (ind[root] != pre[preleft]) //在中序序列中查詢根結點 

root++;

right = preleft + root - indleft; //right為左子樹中最右下結點在前序序列中的位置 

head->lchild = bitreebypreind(pre, ind, preleft+1, right, indleft, root-1);//生成左子樹 

head->rchild = bitreebypreind(pre, ind, right+1, preright, root+1, indright);//生成右子樹

}return head;

} bitree bitreebypostind(elemtype post, elemtype ind, int postleft, int postright, int indleft, int indright)//根據後序和中序序列生成一棵二叉樹

head->data = post[postright];

root = indleft;

while (ind[root] != post[postright]) //在中序序列中查詢根結點 

root++;

left = postleft + root - indleft - 1; //left為左子樹中根結點在後序序列中的位置 

head->lchild = bitreebypostind(post, ind, postleft, left, indleft, root-1);

//生成左子樹 

head->rchild = bitreebypostind(post, ind, left+1, postright-1, root+1, indright);//生成右子樹

}return head;

} void preorderprint(bitree p) //先序遍歷輸出結點(遞迴)

}void inorderprint(bitree p) //中序遍歷輸出結點(遞迴)

}void postorderprint(bitree p) //後序遍歷輸出結點(遞迴)

}

資料結構之樹 根據先序序列和中序序列確定樹

假設某二bai叉樹的先序遍歷序列du是abdgcefh,中序遍歷序列是dgbaechf,畫出zhi二叉樹,並給出其後序遍dao歷序列。分析過程 以下面的例題為例進行講解 已知一棵二叉樹的先序遍歷序列和中序遍歷序列分別是abdgcefh dgbaechf,求二叉樹及後序遍歷序列。分析 先序遍歷序列的第...

根據先序序列和中序,後序和中序序列建立二叉樹

思考 如何才能確定一棵樹?結論 通過中序遍歷和先序遍歷可以確定乙個樹 通過中序遍歷和後續遍歷可以確定乙個樹 通過先序遍歷和後序遍歷確定不了乙個樹。演算法實現 一 先序和中序重建二叉樹,按層次遍歷輸出 include include include include include include in...

根據先序序列和中序序列求後序序列的迴圈實現

1 include2 include3 include4 include5 6using namespace std 78 設計樹的資料模型 9 start 1011 template class t 12class treeseq public vector13 1819 template cla...