标签:tle 第一个 html init 思路 情况 输入 char exp
树的结构:非线性结构,也是递归型的结构,属于集合之间的关系。
困难:如果对递归的算法不是很领悟的时候,对树的一些操作的问题还是不容易理解。
树结构可以解决的问题:
并查集问题
家谱处理问题
哈夫曼编码的问题
表达式转换的问题
void InitExpTree(BTree &T,string str) //建表达式的二叉树 { stack<BTree>s; stack<char>op; 将#进op栈 while 表达式未结束 { if str 不为运算符 将后续的数字存到s栈中 else switch(Precede(op栈顶运算符,str)) { case ‘<‘ 栈顶运算符优先级低 op.push(str) 从str中读取下一个字符 break; case ‘=‘ 只有两个括号满足这个情况 从str读取下一个字符 break; case ‘>‘ 栈s运算符执行 建立结点 s.push( ); break; } } while op顶不为 ‘#‘ 从s中取两个结点
s.push( ); break; }
这题在老师没讲之前,我是想利用栈将中缀表达式转换成后缀表达式在建树,但是后面发现这是道函数题,不能再自己写一个函数了
然后在老师的讲解之下发现可以直接利用中缀表达式建树,那所有问题迎刃而解了。只有清楚< = >三种情况下时候的操作建树就没问题了。
集合大概存储方式:
存储方式就是如此
void match { int child,parent; 输入表达关系的一句话 让child为第一个人物的下标 让parent为第二个人物的下标 switch(关系) { case parent :判断父母 case child :判断父母反过来 case sibling :判断兄弟 case ancestor :判断祖先 case descendant :判断祖先反过来 } if 正确 输出true else false } int Trace(int child) { // 从该名字往前找到第一个空格比他少的名字就是他的parent; for i=child-1 to 0 if 空格少 return i; return -1; } bool CheckParent(int child,int parent) { if Trace(child)==parent true else false } bool CheckAncestor(int child,int ancetor) { while c!=-1 if CheckParent(c,an) true; else c = Trace(c); false; } bool CheckSibling(int child1,int child2) { if Trace(child1)==Trace(child2) true; else false; }
这题的注意事项:
1.只有同一个parent的才能叫sibling;
2.从该名字往前找到第一个空格比他少的名字就是他的parent;
3.Ancestor必须是parent的parent的……parent,而不仅仅是空格比他少就行。
4.此题输入较多,在输入方面会造成缓存区未清空的现象(空格没被吃掉),导致输入未匹配上,这要注意
选择这题的原因:这题是用到了哈夫曼树的思想,但是并没有去建树,而是用到了优先队列,我想粗略了解下优先队列
优先队列:priority_queue
头文件:#include<queue>
定义:priority_queue<类型名>队列名
priority_queue<int,vector<int>,greater<int> >Q; 初始化小先出队列的优先队列 cin -> n for i=0 to n-1 cin -> m Q.push(m) while (Q is not empty){ Q.pop()->x if(Q is not empty) { Q.pop()->y sum=sum+x+y 产生新的结点Q.push()->(x+y) } } cout -> sum
额。。。注意切换编译器吧。
这道题目的精髓之处在于十分考验对建树,遍历,递归的理解。
建树的时候是用到了顺序存储
在判断是否同构的函数里面,凭借分析各种情况去return,有利于加深新手对树的递归模型的理解。
标签:tle 第一个 html init 思路 情况 输入 char exp
原文地址:https://www.cnblogs.com/guangguangge/p/8992441.html