posts - 195,  comments - 30,  trackbacks - 0
From: http://hi.baidu.com/gmchen/blog/item/780c8202aab75b0b4afb517d.html
分享一道曾经的谷歌面试题,觉得特别经典。

        题目:对于一颗完全二叉树,插入一个新的节点。
        struct node
        {
          int data;
            struct node * left;
            struct node * right;
        };
        声明: insert(struct node * tree, struct node new_node);

         
        由于是一颗完全二叉树,所以插入的顺序可以参考图示,插入了节点4,之后应该是节点5。

        拿到题目第一反应就是按层便利,用bfs的就可以搞定,效率在O(n),实现起来也简单,用一个队列就可以完成,这里不多说了。
        当时考官并不满意,于是就有了第二种解法(提示下),试想下如何比O(n)更快呢? 那么就往logn上去考虑了,很自然的想到了二分查找,对于不同的数组而言,二分查找就是找中间的那个点。
        但本题比较特别,因为是完全二叉树,那么插入的点只能在最下一层。于是我们可以去找最下一层的中间点,找到根的左子树的最右下的节点,如果这个点存在,那么说明,最下一层的左边已经填满,递归右子树,否则递归左子树。
   
      


        还是用图例来看会比较清楚(黄色的点代表当前递归的根节点,红色的点代表左子树的最右节点),这里是要插入节点7,当递归到5的右子树时,可以插入。这个算法的复杂度大概在logn到n之间,具体忘记了,有兴趣可以推算下。
        总结:其实这个题目的解答太巧了,要在面试中一步到位基本不可能,但是如果可以在面试官的提示下摸到思路,那么已经达到要求了。再就是如果面到这类题目,不妨先把最简单的bfs方法答上,然后可以在提示下不断改进。
posted on 2011-02-15 01:33 luis 阅读(1651) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年4月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(3)

随笔分类

随笔档案

文章分类

文章档案

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜