先序、中序、後序序列的二叉樹構造演算法
1、定義
如果同時知道二叉樹的先序序列和中序序列,或者同時知道二叉樹的後序序列和中序序列,就能確定這顆二叉樹的形狀。
2、應用
通過二叉樹的先序序列、中序序列或後序序列、中序序列,可構造出唯一的二叉樹結構。
3、實現
(1)二叉樹的型別定義
typedef char ElemType;
typedef struct BTNode
{
ElemType data;
BTNode *left, *right;
}BTNode;
(2)利用先序序列和中序序列構造二叉樹
BTNode* CreateBTByPreAndIn(ElemType* pre, ElemType* in, int n)
{
if (n <= 0) return NULL;
BTNode* b = new BTNode;
b->data = *pre;
int k;
for (ElemType* p = in; p < in + n; p++)
{
if (*p == *pre)
{
k = p - in;
break;
}
}
b->left = CreateBTByPreAndIn(pre + 1, in, k);
b->right = CreateBTByPreAndIn(pre + 1 + k, in + 1 + k, n - k - 1);
return b;
}
(4)利用後序序列和中序序列構造二叉樹
BTNode* CreateBTByPostAndIn(ElemType* post, ElemType* in, int n)
{
if (n <= 0) return NULL;
BTNode* b = new BTNode;
b->data = *(post + n - 1);
int k;
for (ElemType* p = in; p < in + n; p++)
{
if (*p == *(post + n - 1))
{
k = p - in;
break;
}
}
b->left = CreateBTByPostAndIn(post, in, k);
b->right = CreateBTByPostAndIn(post + k, in + k + 1, n - k - 1);
return b;
}
4、測試#include <iostream>
#include <queue>
using namespace std;
typedef char ElemType;
typedef struct BTNode
{
ElemType data;
BTNode *left, *right;
}BTNode;
void LevelOrder(BTNode* root)
{
queue<BTNode*> q;
if (root)
{
q.push(root);
while (!q.empty())
{
BTNode* t = q.front();
cout << t->data << ", ";
if (t->left) q.push(t->left);
if (t->right) q.push(t->right);
q.pop();
}
}
cout << endl;
}
BTNode* CreateBTByPreAndIn(ElemType* pre, ElemType* in, int n)
{
if (n <= 0) return NULL;
BTNode* b = new BTNode;
b->data = *pre;
int k;
for (ElemType* p = in; p < in + n; p++)
{
if (*p == *pre)
{
k = p - in;
break;
}
}
b->left = CreateBTByPreAndIn(pre + 1, in, k);
b->right = CreateBTByPreAndIn(pre + 1 + k, in + 1 + k, n - k - 1);
return b;
}
BTNode* CreateBTByPostAndIn(ElemType* post, ElemType* in, int n)
{
if (n <= 0) return NULL;
BTNode* b = new BTNode;
b->data = *(post + n - 1);
int k;
for (ElemType* p = in; p < in + n; p++)
{
if (*p == *(post + n - 1))
{
k = p - in;
break;
}
}
b->left = CreateBTByPostAndIn(post, in, k);
b->right = CreateBTByPostAndIn(post + k, in + k + 1, n - k - 1);
return b;
}
int main()
{
const char* pre = "ABDGCEF";
const char* in = "DGBAECF";
const char* post = "GDBEFCA";
LevelOrder(CreateBTByPreAndIn(const_cast<ElemType*>(pre),
const_cast<ElemType*>(in), strlen(pre)));
LevelOrder(CreateBTByPostAndIn(const_cast<ElemType*>(post),
const_cast<ElemType*>(in), strlen(post)));
system("pause");
return 0;
}
相關文章
- 從中序與後序遍歷序列構造二叉樹二叉樹
- 根據二叉樹的先序序列和中序序列還原二叉樹並列印後序序列二叉樹
- 還原二叉樹(先序+中序-〉後序)二叉樹
- 二叉樹先知道後序和中序,求先序二叉樹
- 演算法 -- 實現二叉樹先序,中序和後序遍歷演算法二叉樹
- 二叉樹的四種遍歷方法:先序,中序,後序,層序二叉樹
- 已知二叉樹的先序和後序求任意一中序二叉樹
- (樹)根據中序後序構建二叉樹二叉樹
- 由中序序列和先序序列確定一顆二叉樹二叉樹
- 388,先序遍歷構造二叉樹二叉樹
- 二叉樹 前序、中序、後序二叉樹
- 106. 從中序與後序遍歷序列構造二叉樹——Java實現二叉樹Java
- LeetCode-106-從中序與後序遍歷序列構造二叉樹LeetCode二叉樹
- 【二叉樹】前中序求後序,中後序求前序二叉樹
- 非遞迴遍歷二叉樹的四種策略-先序、中序、後序和層序遞迴二叉樹
- 遞迴和迭代實現二叉樹先序、中序、後序和層序遍歷遞迴二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 二叉樹的先中後序遍歷二叉樹
- 後序+中序(前序+中序)重構樹,嚴格O(N)演算法演算法
- 從前序與中序構造二叉樹二叉樹
- 刷題系列 - 中序和後序遍歷佇列,構造對應二叉樹;佇列二叉樹
- PHP基於非遞迴演算法實現先序、中序及後序遍歷二叉樹操作示例PHP遞迴演算法二叉樹
- 【資料結構與演算法】二叉樹的 Morris 遍歷(前序、中序、後序)資料結構演算法二叉樹
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 二叉樹 ---- 前序 中序 後序 知二求一二叉樹
- 二叉樹中序和後序遍歷表示式二叉樹
- 【演算法】二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現記錄(Java版)演算法二叉樹遞迴Java
- 中序先序到後序 洛谷1827
- 資料結構實驗之二叉樹八:(中序後序)求二叉樹的深度資料結構二叉樹
- 二叉樹的前序,中序,後序遍歷方法總結二叉樹
- 中序線索二叉樹的構造和遍歷二叉樹
- 【樹01】對二叉樹前序/中序/後序遍歷演算法的一些思考二叉樹演算法
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- 二叉樹的前序、中序、後序的遞迴和迭代實現二叉樹遞迴
- 資料結構與演算法——二叉樹的前序遍歷,中序遍歷,後序遍歷資料結構演算法二叉樹
- 二叉樹的前中後序遍歷二叉樹
- 二叉樹的建立、前序遍歷、中序遍歷、後序遍歷二叉樹
- 【LeetCode】Construct Binary Tree from Preorder and Inorder Traversal 根據先序序列和中序序列恢復二叉樹LeetCodeStruct二叉樹