山东大学数据结构实验六:二叉树操作

实验内容

①输入一个完全二叉树的层次遍历字符串,创建这个二叉树,输出这个二叉树的前序遍历字符串、中序遍历字符串、后序遍历字符串、结点数目、二叉树高度(上述每一个结果独立一行显示)。

②输入二叉树前序序列和中序序列(各元素各不相同),创建这个二叉树,输出该二叉树的后序序列、层次遍历。

实验步骤

①参考ppt复习,编写BinaryTreeNode节点类,为了方便操作,我把其中的数据,左子和右子都设置成了public。初始化节点类,也是构造了指针数组,对每个类对象都实例化,然后左子2*i,右子2*i+1的方法来的。由于元素不多,树的高度也通过遍历计算2的几次方减1,对比实现。

②编写递归程序->前序遍历、中序遍历、后序遍历,注意输出最后一个字符的时候不能有多余的逗号,需要和输入字符串最后一位比较判断。

③编写返回节点指针的build方法,这里也是递归的思想。从前序遍历中取出第一个元素,就是当前树的“根节点”,然后在中序遍历中找到该元素,该元素的左树就是从pre+1开始对中序0~k-1左子序列的k个元素递归,右树类似。

④编写层次遍历方法,需要用到队列。仔细看看层序遍历过程,其实就是从上到下,从左到右依次将每个数放入到队列中,然后按顺序依次打印就是想要的结果。

实现过程

1、首先将二叉树的根节点push到队列中,判断队列不为NULL,就输出队头的元素,

2、判断节点如果有孩子,就将孩子push到队列中,

3、遍历过的节点出队列,

4、循环以上操作,直到Tree == NULL。

 

本次实验主要代码:
#include<bits/stdc++.h>
using namespace std;

string s;
string pree,inn;
const char*preorder;
const char* inorder;
class BinaryTreeNode{
	public:
		BinaryTreeNode *left;
		BinaryTreeNode *right;
		char data;
};
void Pre(BinaryTreeNode *t){
	if(t!=NULL){
		if(s[s.size()]!=t->data)
		cout<<t->data<<",";
		else
		cout<<t->data;
		Pre(t->left);
		Pre(t->right);
	}
}
void in(BinaryTreeNode *t){
	if(t!=NULL){
		in(t->left);
		if(s[s.size()]!=t->data)
		cout<<t->data<<",";
		else
		cout<<t->data;
		in(t->right);
	}
}
void post(BinaryTreeNode *t,char s){
	if(t!=NULL){
		
		post(t->left,s);
		post(t->right,s);
		if(s!=t->data)
		cout<<t->data<<",";
		else
		cout<<t->data;
	}
}
void level(BinaryTreeNode *t){
		queue<BinaryTreeNode*> q;
		q.push(t);
		bool flag = true;
		if(pree.size()==1){
			flag = false;
		} 
		while(!q.empty()&&(q.size()!=1||flag)){
		flag = false;
			 cout << q.front()->data << ","; 
			 
			if (q.front()->left != NULL)   
        {
            q.push(q.front()->left);   
        }

        if (q.front()->right != NULL)   
        {
            q.push(q.front()->right);
        }
        q.pop();  
		}
	    cout << q.front()->data;
}

BinaryTreeNode * build(const char* preorder,const char* inorder,int n){
	if(n==0)return NULL;
	int k=0;
	while(preorder[0]!=inorder[k])k++;
	BinaryTreeNode *t=new BinaryTreeNode;
	t->data = preorder[0];
	t->left=build(preorder+1,inorder,k);
	t->right = build(preorder+k+1,inorder+k+1,n-k-1);
	return t;
}

int main(){
	cout<<"Input1"<<endl;
	int num = 0;
	cin>>s;
	for(int i=s.size()+1;i>0;i--){
		s[i]=s[i-1];
	}
	BinaryTreeNode **b=new BinaryTreeNode*[20];
	for(int i=0;i<20;i++){
		b[i] = new BinaryTreeNode;
	}
	for(int i=1;i<=s.size();i++){
		b[i]->data=s[i];
	}
	for(int i=1;i<=s.size();i++){
	if(2*i<=s.size()){
			b[i]->left=b[2*i];
		}
		else{
			b[i]->left=NULL;
		}
	if(2*i+1<=s.size()){
			b[i]->right=b[2*i+1];
		}
		else{
			b[i]->right=NULL;
		}	
	}
	cout<<"Output1"<<endl;
	Pre(b[1]);
	cout<<endl;
	in(b[1]);
	cout<<endl;
	post(b[1],s[1]);
	cout<<endl<<s.size()<<endl;
	for(int i=1;i<=6;i++){
		if(pow(2,i)-1==s.size()){
			cout<<i<<endl;
			break;
		}
	}
	cout<<"Input2"<<endl;
	
	cin>>pree>>inn;
	 preorder = pree.data();
	 inorder = inn.data();
	cout<<"Output2"<<endl;
	post(build(preorder,inorder,pree.size()),pree[0]);
	cout<<endl;
	level(build(preorder,inorder,pree.size()));
	cout<<endl<<"End0"<<endl;
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/Sunnyztg/article/details/128280605