标签: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