标签:建立 一个 tac nod return 返回 学生 mil 朋友圈
建树:
建立一个存放符号的栈op,和存放根结点的栈root
往符号栈op中存入#
while(字符串未遍历完)
如果是数字
定义一个根节点并初始化并且值为这个数字
将这个根节点入根节点栈root
否则
while(op栈的栈顶优先级大于此时遍历的符号)
定义一个根节点并初始化并且值为op栈顶元素
op栈顶元素出栈
root栈出栈两个元素作为刚定义的根节点的左右孩子
入栈这个根节点
如果(op栈的栈顶优先级小于此时遍历的符号)
将这个符号入栈到op栈
否则
op栈出栈
while(栈顶元素不为#即还有需要建立的结点)
定义一个根节点并初始化并且值为op栈顶元素
op栈顶元素出栈
root栈出栈两个元素作为刚定义的根节点的左右孩子
入栈这个根节点
根节点为此时root栈的栈顶
计算:(简要说明)
非递归后序遍历遇到数字入栈,遇到符号就出栈两个元素计算然后将结果入栈
最后的栈顶元素为结果
1.遇到除数为0时,没有中止程序而是return 导致错误
2.计算时栈定义成int类型的,应该定义成double类型
建树成功后求WPL:
定义一个静态局部变量WPL
如果BT不为NULL
如果BT为叶子节点
WPL=WPL+权重乘与高度减1
递归(BT的左孩子,高度加1)
递归(BT的右孩子,高度加1)
否则
返回WPL
题目中空孩子的孩子也要用#输入表示孩子为空,在建树的时候没考虑到导致错误
定义一个pre数组表示根的数组并初始化
输入俱乐部的个数n和学生人数m
for i=1 to m
输入此俱乐部的人数number
定义一个 a数组长度为俱乐部人数加一
for j=1 to number
输入a[i]
for j=2 to number
将a[j-1]的根节点设为a[j]
for i=1 to n
寻找根节点相同的人并统计人数
如果人数大于max max=人数
输出max
一开始对这种数组的并查集不会用,不明白根节点的意义,写着写着才会。
代码:
stack <Bt> Family;
int n , m , pre=0 ;
Bt Anc = new Node , p = Anc ;
cin >> n >> m >> Anc->name ;
getchar();
Anc->son = Anc->bro = Anc->par = NULL;
Family.push( Anc );
while( --n ){
string name;
getline( cin , name );
int cnt = count( name.begin() , name[i].end() , ‘ ‘ );
Bt add = new Node;
add->name = name.substr( cnt );
add->son = add->bro = NULL;
cnt /= 2;
if( cnt > pre ){
p->son = add;
add->par = p;
Family.push( p );
}
else if( cnt == pre ){
p->bro = add;
add->par = p->par;
}
else{
for( int i = 1 ; i<=pre-cnt ; i++ )
Family.pop();
p = Family.top()->son;
while( p->bro )
p = p->bro;
p->bro = add;
add->par = p->par;
}
p = add;
pre = cnt;
}
功能:pta家谱处理的建树。
一开始做这道题我也想着用树做的,但是由于不会用树,只会一丢丢的二叉树,所以最后用了伪并查集做,我觉得用树还是比较优秀的。
这里获得没有空格的子串还是比较巧妙的,运用了字符串的函数,数出空格个数再获得子串。
这是吴军霖同学的代码,详情请见 吴俊霖的pintia.cn
标签:建立 一个 tac nod return 返回 学生 mil 朋友圈
原文地址:https://www.cnblogs.com/zbh0831/p/8994913.html