二叉树遍历(flist)(4月3日)

该程序定义了一个结构体node来表示二叉树的节点,通过输入的中序遍历和层次遍历序列,利用递归方法创建二叉树。首先找到层次遍历中的根节点,然后分割中序遍历序列,分别创建左子树和右子树。最后,实现先序遍历打印创建的二叉树。
摘要由CSDN通过智能技术生成
#include<bits/stdc++.h>
using namespace std;

struct node
{
	char x;
	int left,right;
}node[50];

int p;

// 创建二叉树 
int create(string sm, string sl)
{
	if(sm == "" || sl == "")
		return 0;
		
	// 找到中序遍历中与层次遍历的第一个字符(级根节点) 
	int j;
	for(j = 0; j < sm.length(); j++)
		if(sm[j] == sl[0])
			break; 
	// 此时在中序遍历中找到了根节点
	
	// 将找到的根节点的左(右)子节点插入到sm_left(sm_right) 
	string sm_left = sm.substr(0,j), sm_right = sm.substr(j+1),sl_left,sl_right;
	 
	// 将左子节点进行标记 
	bool isLeft[128] = {};
	for(int i = 0; i < sm_left.length(); i++)
		isLeft[sm_left[i]] = 1;
	
	// 在层次遍历中将左子节点和右子节点进行分别存储 
	for(int i = 1; i < sl.length(); i++)
	{
		if(isLeft[sl[i]])
			sl_left.push_back(sl[i]);
		else 
			sl_right.push_back(sl[i]);
	} 
	
	// 利用递归分别创建根节点左子树以及右子树 
	int np = ++p;
	node[np].x = sl[0];
	node[np].left = create(sm_left, sl_left);
	node[np].right = create(sm_right, sl_right);
	
	// 返回创建好的 
	return np;
}

void pre(int root)
{
	if(root == 0)
		return;
	cout << node[root].x;
	pre(node[root].left);
	pre(node[root].right);
} 

int main()
{
	string smid, sleft;
	cin >> smid >> sleft;
	int root = create(smid, sleft);
	pre(root);
	return 0;

}

不会写,看ph的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值