先简单说一下这个代码是干啥的
这是插入一个数时,如果发现当前位置有数,且插入的数大于当前数,小于当前位置右孩子的数,就在这里新建一个节点,让当前节点成为新的右孩子,且让它的右孩子为原来树的右孩子。
源代码
if(vis[tr[p].rc] && x<a[tr[p].rc])
{
int nw=top+1;
vis[nw]=1;
printf("我赋值了哦,右子树为%d\n",tr[p].rc);
tr[nw].__init__(p,top+2,tr[p].rc,tr[tr[p].rc].sz+1);
top+=2;
printf("在验证一下%d\n",tr[nw].rc);
tr[tr[p].rc].fa=nw;
tr[p].rc=nw;
a[nw]=x;
return;
}
修改后(将++top改掉了)
if(vis[tr[p].rc] && x<a[tr[p].rc])
{
int nw=top+1;
vis[nw]=1;
printf("我赋值了哦,右子树为%d\n",tr[p].rc);
tr[nw].__init__(p,top+2,tr[p].rc,tr[tr[p].rc].sz+1);
top+=2;
printf("在验证一下%d\n",tr[nw].rc);
tr[tr[p].rc].fa=nw;
tr[p].rc=nw;
a[nw]=x;
return;
}
问题:
自己的输入:
5
1 3
1 2
1 5
1 4
1 1
结果经过测试发现4的右孩子下表被吃了,右孩子下标记录为“0”
然后将++top改掉后就正常了,请问是什么原理?