#include<iostream>
#include<queue>
using namespace std;
struct Btnode {
struct Btnode *left;
struct Btnode *right;
int value;
};
typedef struct Btnode *BTree;
int index = -1;
int pre[] = { 1, 2, 4, 8, 9, 5, 10, 11, 3, 6, 12, 13, 7, 14, 15 };
int in[] = { 8, 4, 9, 2, 10, 5, 11, 1, 12, 6, 13, 3, 14, 7, 15 };
//由前序与中序序列,一样可以构造出一棵二叉树的。
//参数解释
/*
BTree &T:因为要对二叉树进行写入数据,对二叉树有实际的物理改动,因此一定要加&,表示引用
root:表示前序序列的起始下标
start:表示中序序列的起始下标
end:表示中序序列的结束下标
*/
void post(BTree &T,int root,int start,int end)
{
if (start > end)
{
T = NULL;//说明左子树为空或者右子树为空
return;//结束递归
}
index++;
T= (BTree)malloc(sizeof(Btnode));
int i = start;
while (i < end&&in[i]!=pre[root])i++;//查找前序序列的节点在中序序列中的位置
//将中序序列分为左子树和右子树,进行递归。
T->value = pre[index];//直接将前序序列的值赋值给构造的二叉树
//因为二叉树的构造是从根节点开始构造,所以只能从前序序列中取值
//然后为其赋值(个人观点,因为目前还没有尝试过有没有其他的方法解决这个问题(^_^)(^_^))
//cout << T->value << " ";
post(T->left,root+1,start,i-1);//对左子树进行递归
post(T->right,root+1+i-start, i + 1, end);//对右子树进行递归
//cout<<in[i]<<" "; 此处输出可以得到后序遍历的结果。
}
//层序输出
void level(BTree t)
{
queue<BTree> que;
if (t)
{
BTree q;
que.push(t);
while (!que.empty())
{
q = que.front();
que.pop();
cout << q->value << " ";
if (q->left != NULL)
{
que.push(q->left);
}
if (q->right != NULL)
{
que.push(q->right);
}
}
}
}
//交互左右子树
void binary_change(BTree T)
{
if (T)
{
BTree temp;
temp = T->left;
T->left = T->right;
T->right = temp;
binary_change(T->left);
binary_change(T->right);
}
}
int main()
{
BTree t;
post(t,0, 0, 14);
cout << endl;
cout << "层序输出" << endl;
level(t);
cout << endl;
cout << "交换二叉树左右节点" << endl;
binary_change(t);
level(t);
cout << endl;
system("pause");
}
已知二叉树前序中序,构造一课二叉树
最新推荐文章于 2022-06-06 19:39:13 发布