题解 | 二叉树遍历

#include<iostream>
#include<string>
using namespace std;

//构建一个结构体用来表示一个树的节点 
struct node{
	char value;
	struct node * left = NULL;
	struct node * right = NULL;
};

//建立一个函数返回特定的节点在序列中的下标
int searchInSeries(string s,char ch){
	int n = s.length();
	for(int i = 0;i<n;i++){
		if(s[i]==ch){
			return i;
		}
	}
	return -1;	//如果执行到这里,肯定出错了
}

//构建 一颗树(根节点,前序遍历,中序遍历,左起范围,右起范围)
void createTree(struct node* root,string s1,string s2,int l, int r){
	if(root==NULL) return;
	if(l>=r) return;
	char core = root->value;
	int index1 = searchInSeries(s2,core);	//中序遍历index
	int index2 = searchInSeries(s1,core);	//前序遍历index
	//如果我的左侧还有机会是一棵树
	if(index1>l){
		int dk = index2;
		for(int i = index2;i<s1.length();i++){
			dk = searchInSeries(s2,s1[i]);
			if(dk<index1){
				break;
			}
		}
		char c = s2[dk];
		struct node* newNode = new struct node;
		newNode->value = c;
		root->left = newNode;
		//继续以其作为根节点访问下一层
		createTree(root->left,s1,s2,l,index1-1);
	}
	//如果我的右侧也有机会是一棵树
	if(index1<r){
		int dk = index2;
		for(int i = index2;i<s1.length();i++){
			dk = searchInSeries(s2,s1[i]);
			if(dk>index1){
				break;
			}
		}
		char c = s2[dk];
		struct node* newNode = new struct node;
		newNode->value = c;
		root->right = newNode;
		//继续以其作为根节点访问下一层
		createTree(root->right,s1,s2,index1+1,r);
	}
}

//按照后序遍历遍历一棵树(先左后右然后根节点)
void travelTree(struct node* root){
	if(root==NULL) return;
	if(root->left!=NULL){
		travelTree(root->left);
	}
	if(root->right!=NULL){
		travelTree(root->right);
	}
	if(root!=NULL){
		cout<<root->value;
	}
}

/*
 *二叉树遍历
 * */
int main(){
	string s1,s2;	//二叉树的前序和中序遍历
	while(cin>>s1>>s2){
		int n1 = s1.length();
		int n2 = s2.length();
		//首先从前序遍历入手,构建一颗二叉树
		struct node root;
		root.value = s1[0];
		//构建树
		createTree(&root,s1,s2,0,n1-1);
		travelTree(&root);
        cout<<endl;
	}
}

全部评论

相关推荐

03-08 18:11
门头沟学院 Java
Java抽象小篮子:海投就完事了,简历没什么问题,最大问题是学历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务