重建二叉树——输入前序、中序遍历构建二叉树并输出后序遍历

重建二叉树(轻量级)

输入某二叉树的前序遍历和中序遍历的结果,重新建立该二叉树。假设输入的前序遍历和中序遍历的结果都不含重复的数字。


//输入某二叉树的谦虚遍历和中续遍历的结果,重新简历该二叉树。
//假设输入的前序遍历和中续遍历的结果中都不含重复的数字
// 前提:前序遍历*p1、中序遍历*p2是正确的
// by nby
#include<iostream>
using namespace std;


struct btnode
{
int data;
btnode *pr;
btnode *pl;
};


btnode *ConstructCode(int *p1s, int *p1e, int *p2s, int *p2e)
{
btnode *root = new btnode;
root->data = *p1s;
root->pl = root->pr = NULL;
if (p1s == p1e)
return root;
int i = 0;
while (1)
{
if (p1s[0] == p2s[i]) //只有一个节点
break;
i++;
}
//root->pl = NULL;
/*if (i == 0)
root->pl = NULL;*/  
if (i > 0) //左子树
root->pl = ConstructCode(p1s + 1, p1s + i, p2s, p2e + i - 1);
//root->pr = NULL; 
/*if (p1e - p1s == i)
root->pr = NULL;*/
if (p1e-p1s>i)//右子树
root->pr = ConstructCode(p1s + i + 1, p1e, p2s + i+1, p2e);


return root;


}


// 前提:前序遍历*p1、中序遍历*p2是正确的
btnode *Construct(int *p1, int *p2, int length)
{
if (p1 == NULL || p2 == NULL || length <= 0)
return NULL;
else
return ConstructCode(p1, p1 + length - 1, p2, p2 + length - 1);
}


// 后续遍历输出二叉树
void CoutBree(btnode *root)
{
if (root == NULL)
return;
CoutBree(root->pl);
CoutBree(root->pr);
cout << root->data << " ";
}




int main()
{
int p1[] = { 1, 2, 4, 7, 3, 5, 6, 8 };
int p2[] = { 4, 7, 2, 1, 5, 3, 8, 6 };

btnode *root = Construct(p1, p2, sizeof(p1) / sizeof(p1[0]));
cout << "后续遍历输出二叉树: ";
CoutBree(root);
cout << endl;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值