某农业大学数据结构A-第9周作业

1. 二叉树的深度及结点最远距离

【问题描述】考研真题:求二叉树的深度及二叉树中最远两个结点的距离。

【输入形式】拓展的前序遍历序列

【输出形式】深度和距离

【样例输入】AB#C##DE#G#H##F##

【样例输出】5 6

#include
#include
using namespace std;
#define elemtype char
elemtype a[101];

struct node
{
	node *l;
	node *r;
	elemtype data;
};

node*creat(elemtype a[],int len,int& i)
{
	if(a[i]!='#' && idata=a[i];
		r->l=creat(a,len,++i);
		r->r=creat(a,len,++i);
		return r;
	}
	else
	return NULL;
}

int getdeep(node *s,int cout,int& deep)
{
	if(s!=NULL)
	{
		deep = max(deep,cout);
		getdeep(s->l,cout+1,deep);
		getdeep(s->r,cout+1,deep);
		return deep;
	}
	else
	return 0;
}

void getdistant(node *s,int& dis)
{
	if(s==NULL)
	    return ;
	    
	int i,j,deep=0;
	i=getdeep(s->l,1,deep);
	deep=0;
	j=getdeep(s->r,1,deep);
	
	if(i+j>dis) 
	    dis=i+j;
	if(s->l) 
	    getdistant(s->l,dis);
	if(s->r) 
	    getdistant(s->r,dis);
}

int main()
{
	cin >> a;
	int len=strlen(a);
	node*s;	
	int deep=0,i=0,dis=1;
	s=creat(a,len,i);
	deep=getdeep(s,1,deep);
	getdistant(s,dis);
	cout << deep <<" " << dis;
	return 0 ;
}
2. 二叉树结点的共同祖先问题

【问题描述】假设二叉树采用二叉链表方式存储,root指向根结点,p所指结点和q所指结点为二叉树中的两个不同结点,且互不成为根到该结点的路径上的点,编程求解距离它们最近的共同祖先。

【输入形式】二叉树的前序和中序遍历序列,用以创建该二叉树的链式存储结构;以及二叉树的两个结点数据 x 和 y

【输出形式】结点数据值为 x 和结点数据值为 y 的最近的共同祖先,若没有共同祖先则输出NULL,请注意一个结点本身不能成为另一个结点的共同祖先。

【样例输入】

GABDCEF

BDAEFCG

DF

【样例输出】

A

#include
#include
using namespace std;
char pre[101],mid[101];

struct node
{
	char data;
	node *l;
	node *r;
};

//x:前序左,y:前序右,s:中序左,q:中序右 
node*build(int x,int y,int s,int q)
{
	if(x>y || s>q)
	return NULL;
	int i;
	node *a=new node;
	a->data=pre[x];
	for(i=s;i<=q;i++)
	{
		if(pre[x]==mid[i])
		break;
	}
	a->l=build(x+1, x+i-s ,s , i-1);
	a->r=build(x+i-s+1 ,y ,i+1,q);
	return a;
}

node*find(node *root,node *a1,node *b1)
{
	if(root==NULL)
	    return NULL;
	if(root->data==a1->data || root->data==b1->data)
	return root;
	node *a2=find(root->l,a1,b1);
	node *b2=find(root->r,a1,b1);
	
	if(a2!=NULL && b2!=NULL)
	return root;
	if(a2!=NULL)
	return a2;
	if(b2!=NULL)
	return b2;
	else
	return NULL;
}

int main()
{
	cin >> pre >> mid ;
	int len=strlen(pre);
	node *root;
	root = build(0,len-1,0,len-1);
	
	char a,b;
	cin >> a >> b;
	node *a1=new node;
	node *b1=new node;
	node *s1=new node;
	a1->data=a;
	b1->data=b;
	
	s1 = find(root,a1,b1);
	if(s1!=NULL && s1->data!=root->data)
	{
		cout << s1->data;
	}
	else cout << "NULL";
	return 0;
}
3. 中序线索二叉树

【问题描述】创建一棵二叉树,接着中序线索化该二叉树,然后编写相应函数遍历该中序线索二叉树

【编码要求】线索二叉树遍历过程中不能使用递归、不能使用栈。

【输入形式】二叉树拓展的前序遍历序列

【输出形式】中序遍历序列

【样例输入】AB#D##CE###

【样例输出】BDAEC

#include
#include 
using namespace std;
char a[101];

struct node//定义结构类型 
{
	char data;
	node*l;
	node*r;
	int ltag,rtag;
};

node*creat(char a[],int& len,int& i)//对传入的字符串进行处理 
{
	if(a[i]!='#' && idata=a[i];
		r->ltag=r->rtag=0;
		r->l=creat(a,len,++i);
		r->r=creat(a,len,++i);
		return r;
	}
	else
	return NULL;
}

node *pre=NULL;
void Inthread(node *root)//创建中序线索数 
{
	if(root!=NULL)
	{
		Inthread(root->l);
		if(root->l==NULL)
		{
			root->l=pre;root->ltag=1;
		}
		if(pre!=NULL && pre->r==NULL)
		{
			pre->r=root;pre->rtag=1;
		}
		pre=root;
		Inthread(root->r);
	}
}

void Inorder(node *root)//中序遍历二叉树 
{
	node *r;
	r=root;
	while(r!=NULL && r->ltag==0 &&r->l!=NULL)
	    r=r->l;
	while(r!=NULL)
	{
		cout << r->data;
		if(r->rtag==1)
		    r=r->r;
		else
		{
			r=r->r;
		    while(r!=NULL && r->ltag==0 &&r->l!=NULL)
	            r=r->l;
		}
	}
}

int main()
{
	cin >> a;
	int len=strlen(a);
	node*s;
	int i=0;
	s=creat(a,len,i);
	Inthread(s);
	Inorder(s);
	return 0;
}
4. 二叉树左右子树交换操作

【问题描述】二叉树按照二叉链表的方式存储。编写程序,计算二叉树中叶子结点的数目并输出;编写程序,将二叉树的每个结点的左、右子树进行交换,请注意不是只交换结点的data值,而是左、右孩子指针指向的交换,最后输出交换后的二叉树的后序遍历序列。

【输入形式】二叉树的前序遍历序列,空指针的位置输入字符#

【输出形式】叶子结点的数目;左右子树交换后,后序遍历的序列,空子树的位置输出字符#

【样例输入】

ABE##F##CG###

【样例输出】

3

###GC##F##EBA

#include
#include
using namespace std;
char elem[101];

struct node
{
	char data;
	node *l;
	node *r;
};

node*creat(char elem[],int len,int& i)//处理字符串 
{
	if(idata=elem[i];
		r->l=creat(elem,len,++i);
		r->r=creat(elem,len,++i);
		return r;
	}
	else
	return NULL;
}

void exchange(node *root)//交换左右子树 
{
    node *r=new node;
	if(root!=NULL)
	{
		r=root->l;
		root->l=root->r;
		root->r=r;
		exchange(root->l);
		exchange(root->r);
	}
}

int count=0;
void yezi(node*root)
{
	if(root!=NULL)
	{
		yezi(root->l);
		yezi(root->r);
		if(root->l==NULL && root->r==NULL)
		count++;
	}
}

void Post_order(node *root)
{
	if(root!=NULL)
	{
		Post_order(root->l);
		Post_order(root->r);
		cout << root->data;
	}
	else
	cout << '#';
}

int main()
{
    cin >> elem;
	int len = strlen(elem);
	
	int i,cout1=0;
	for(i=0;i
5. 数组循环右移K位

【问题描述】将一个数组中的元素循环右移K位,要求只使用一个元素大小的附加存储空间,时间复杂度为O(n)。

【样例输入】

1 2 3 4 5 6 7 8 0

2

【样例输出】

7 8 1 2 3 4 5 6

【提示】0代表输入结束

#include
#include

int main()
{
	int elem1[101],elem2[101];
	int i,j,k;
	for(i=0;i<101;i++)
	{
		scanf("%d",&elem1[i]);
		if(elem1[i]==0)
		break;
	}
	int len=i;
	i=0;
	//for(int cou=0;coulen )
	k=k%len;
		int a=len-k;
		for(j=0;j

你可能感兴趣的:(数据结构A,算法,数据结构,c++)