牛客网 二叉树遍历 华中科技大学上机 根据前序遍历和中序遍历建立二叉树并输出其后序遍历 计算机考研机试指南整理

在这里插入图片描述
通过这些组合可以建立起一棵二叉树
在这里插入图片描述
这里关注前序遍历和中序遍历中,左子树和右子树的切分点

#include <cstdio>
#include <iostream>
#include <string>
#include <queue> 

using namespace std;

void visit(char c){
	cout<<c;
	return ;
}

struct TreeNode{
	char data;
	TreeNode* leftchild;
	TreeNode* rightchild;
	TreeNode(char c):data(c),leftchild(NULL),rightchild(NULL){} //构造函数  nullptr;
};

void PreOrder(TreeNode* root){
	if(root == NULL){
		return;
	}
	visit(root->data);
	PreOrder(root->leftchild);
	PreOrder(root->rightchild);
	return;
}

void InOrder(TreeNode* root){
	if(root == NULL){
		return;
	}
	InOrder(root->leftchild);
	visit(root->data);
	InOrder(root->rightchild);
	return;
}

void PostOrder(TreeNode* root){
	if(root == NULL){
		return;
	}
	PostOrder(root->leftchild);
	PostOrder(root->rightchild);
	cout<<root->data;
	return;
}

void LevelOrder(TreeNode* root){ //层次遍历。利用队列。
	queue<TreeNode*>myQueue;
	if(root != NULL){
		myQueue.push(root);
	}
	while(!myQueue.empty()){
		TreeNode* current =myQueue.front();
		myQueue.pop();
		visit(current->data);
		if(current->leftchild!= NULL){
			myQueue.push(current->leftchild);
		}
		if(current->rightchild != NULL){
			myQueue.push(current->rightchild);
		}
	}
	return;
}

TreeNode* Build(string s1,string s2){ //根据前序遍历和中序遍历建立一棵二叉树 
	if(s1.size() == 0){
		return NULL;
	} 
	char c = s1[0];
	TreeNode* root = new TreeNode(c); //创建新节点
	int position = s2.find(c);  //切分点P
	root->leftchild = Build(s1.substr(1,position),s2.substr(0,position)); //sub(起始位置,长度)
	root->rightchild = Build(s1.substr(position + 1),s2.substr(position+1)); 
	return root; 
}

int main(void){   //通过前序遍历和中序遍历构件二叉树并输出其后续遍历
	string str1,str2;
	while(cin>>str1>>str2){
		TreeNode* root = Build(str1,str2);
		PostOrder(root);
		cout<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值