第04次作业-树

1.学习总结

1.1树结构思维导图

1.2 树结构学习体会

认识:
树是由n个节点组成的有限集合,它是一种非线性结构,它的每一个结点可以有0个或多个后继结点,但是只有一个前驱结点(除了根结点),数据元素之间存在一对多的关系。

遇到的困难:
课上听得懂老师讲的内容,但是打代码的时候又不知从何下手,对递归的理解也不够透彻,打代码的时候会被绕晕。

树结构可以解决的问题:
可以将表达式进行转换,处理家谱,查找文件等。

2.PTA实验作业

2.1 题目1:6-3 先序输出叶结点

2.2 设计思路

void PreorderPrintLeaves{
	if BT不为0
		if只有一个根结点
			输出根结点的元素
		end if
	    end 
		PreorderPrintLeaves(BT->Left);
		if BT->Left的左子树,右子树均不为空
			输出BT结点的元素;
			end if
		PreorderPrintLeaves(BT->Right);
		if BT->Right的左子树,右子树均不为空
			输出BT结点的元素;
			end if
	end if 
	end 
} 

2.3 代码截图

2.4 PTA提交列表说明。


错误:
一开始只有空树的测试点是对的,然后加了判断是否只有根结点后,对了另外两个测试点,空树变成了错的。

解决方法:
将判断是否只有根结点的代码放到判断树是否为空的代码中,便可以通过。

2.1 题目2:6-4 jmu-ds-表达式树

2.2 设计思路

void InitExpTree(BTree &T,string str){
	定义栈s1存储树,s2存储运算符;
	BTree BT,a,b;
	定义i等于0;
	while i<str.size()
	then	
		if str[i]不是运算符
			CreateExpTree( BT , NULL , NULL , str[i] );
			s1.push(BT);
		else
			if s2为空
				将str[i]进栈s2;
				i++;
			end if
			else
				while s2不为空,且s2栈顶元素的优先级小于str[i];
				then
					将s1栈顶元素值赋给a;
					s1出栈;
					将s1栈顶元素值赋给b;
					s1出栈;
					CreateExpTree( BT ,a , b , s2.top() );
					将BT入栈s1;
					s2出栈;
				end while
				while S2不为空,且s2栈顶元素的优先级大于str[i] 
				then
					将str[i]入栈s2; 
					i++;
				end while
				while  S2不为空,且s2栈顶元素的优先级等于str[i]
				then
					s2出栈;
				end while 
	end
	while s2不为空
	then 
		将s1栈顶的值赋给a;
		s1出栈; 
		将s1栈顶的值赋给b;
		s1出栈;
		CreateExpTree( BT , a , b , s2.top() );
		s2出栈;
		BT入s1栈; 
	end while
	将s1.top的值赋给T; 
	
}

2.3 代码截图


2.4 PTA提交列表说明


错误:
没有判断栈是否为空,加上以后还是错误,还没有找到如何修改。

2.1 题目2:7-2 根据后序和中序遍历输出先序遍历

2.2 设计思路

定义全局变量h[1000],z[1000]来存储后序和中序 
int main()
{
    定义n,i;
    输入n,h[i],z[i]的值;
    Tree head = RestoreTree(0,n-1,0,n-1);     
    输出PostOrder;
	PostOrder(head);
}
Tree RestoreTree(int h1,int h2,int z1,int z2){
	Tree T;
	定义i;
	if h1>h2
		T为空;
	end if
	else
		给T申请存储空间;
		将h[h2]的值赋给T结点;
		for  i等于z1 to z2
			if z[i] 等于 h[h2];
				break;
		end
		T->left=RestoreTree(h1,h1+i-z1-1,z1,i);  
    	T->right=RestoreTree(h1+i-z1,h2-1,i+1,z2); 
    end
	返回T; 
}
void PostOrder(Tree BT){
	输出BT结点的值;
	PostOrder(BT->left);
	PostOrder(BT->right);
} 

2.3 代码截图

2.4 PTA提交列表说明。


错误:
没有看清楚题目,把给的后序遍历当成了先序遍历,以为输出格式是只有数字之间要空格。

解决方法:
把后序遍历的最后一个值赋给T,再将递归的时候传入函数的值修改,输出时是每个数字前面都要一个空格,最后一个数末尾没有空格。

3.截图本周题目集的PTA最后排名

3.1 PTA排名截图

3.2 我的总分:1.5

4. 阅读代码(必做)


地址:

https://gitee.com/zhoubinghui/data_structure/blob/master/%E6%A0%91%E4%BB%A3%E7%A0%81/7-1%20%E8%BF%98%E5%8E%9F%E4%BA%8C%E5%8F%89%E6%A0%91.cpp

功能:
还原二叉树

优点:
通过使用递归函数,根据给出的树的先序和中序遍历来还原二叉树,思路清晰。

5. 代码Git提交记录截图

posted @ 2018-05-05 20:08  张馨玙  Views(309)  Comments(0Edit  收藏  举报