2010年11月21日微软实习生笔试题--反序对 数目求解

题目大意:输入n个正整数(<=2,000,000),计算其中的反序对的个数。例如5,4,3,2,1的反序对数是4对,1,2,3,4,5的反序对数是0。(注意是相邻的逆序,不统计不相邻的逆序,当时搞错了,太冤了,但大概思想是对的。 后来经下面的哥们提醒,确实如果只是相邻的只要O(n)就能解决了,不需要O(nlogn)。那么推理原来的思想是对的,也就是统计所有的,5,4,3,2,1应该是10对。总之给出了两种情况的二叉树方法
解决方法:1)将输入的数字按输入的顺序建立二叉排序树,(如果大于或等于该节点,则比较它的右子树;如果小于则比较它的左子树。当比较到空节点时,则插入这个节点)。
              2)计算反序对数,遍历树的每个节点,如果该节点没有左子树则反序对为0,往其右子树遍历。如果该节点右左子树,则统计其左子树上的所有节点的个数。  递归的临界条件是:当前结点的左右结点都为空,返回0。

当时的想法是对的,程序也编的差不多。今天实际在机子上编写,发现原来的纸上的程序还是有很多问题的。(今天也弄了将近一个小时)
     昨天的问题:1)没有Public,
                       2)template针对Class变量的使用错误,建立是需要TreeNode * root=new TreeNode();  即在类名后面加上类型。 函数传递时也需要将TreeNodeT变量加入。
                       3)递归的时候在只需要一个函数就可以了,临界条件是对的,但是当右子树时
if(pTree->rightchild!=NULL)  //注意是if,不是while,因为已经递归的计算了
{
    return CaculateReversePairs(pTree->rightchild);//右子树,不能加1
}
不需要加1,当时可能没哟加1,但是印象中又好像加了,这一点非常重要。
未命名
未命名
未命名

 

############.cpp#######################

 

二、如果按照我的思想,即每个节点都要统计左子树所有节点数目。例如5,4,3,2,1逆序数为10,(5.4)……(5,1);(4,3)……(4,1);……(2,1)
    这就需要在每次访问该节点时统计该节点左子树的所有节点数目。并且按这种方式中序遍历树中的所有节点。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值