首页 > 其他 > 详细

13年10月 月赛第一场 set 1 无限完全二叉树的层次遍历

时间:2014-03-02 21:09:00      阅读:639      评论:0      收藏:0      [点我收藏+]

题目

bubuko.com,布布扣

给定这么一个二叉树, 求解 (1) 对于给定正整数 n, 求解其值, 比如当 n = 5 时, 返回 p = 3, q = 2 (2) 对于给定的 p,q 返回其序号 n

 

思路

1. 最初以为这是道数学题, 但当画出第四层叶子节点时, 发现即便这是道数学问题, 也可以用递归求解. 同时因为此题属于完全二叉树, 所以使用递归效率也不会太差, 毕竟每次递归数据规模都可以减少一半

2. 已知 n 或已知 p,q 都属于某一个叶子节点, 因此我们需要从底向上推导, 属于 bottomUp 算法. 我曾总结过 bottomUp 算法, 那次的结论是使用后序遍历即可, 但这是一道逻辑上的树, 不能进行后续遍历, 所以需要另想方法

3. 对于第一问, 已知 n, 通过手工计算的话, 是根据 n 的奇偶性选择向上走的方向, 一直走到 root, 记录路径再回溯回来. 用递归实现, 有点意思, 这里我还想了蛮长时间, 毕竟第一次接触, 感觉有点绕, 最后写出这样的代码

bubuko.com,布布扣
pair<int, int> bottomUp(int n, int &p, int &q) {
    if(n == 1) {
        p = 1;
        q = 1;
        return pair<int, int>(1,1);
    }
    // n != 1;
    pair<int, int> retVal = bottomUp(n/2, p, q);

    if(n & 1) { // odd number
        p = p+q;
    }else{
        q = p+q;
    }
}
bubuko.com,布布扣

代码的精髓在于使用一个函数来做出了 bottomUp and 回溯回去两个过程

4. 第 2 问就显得更加直接了, 思路相同

bubuko.com,布布扣
void nth(int p, int q, int &n) {
    if(p == 1 && q == 1) {
        n = 1;
        return;
    }
    if(p > q) {
        int newp = p-q;
        nth(newp, q, n);
        n = n*2 +1;
    }else{
        int newq = q-p;
        nth(p, newq, n);
        n *= 2;
    }
}
bubuko.com,布布扣

 

想到 Leetcode 上一道题, 求解十进制数中 1 的个数, 递归求法同样奇妙

13年10月 月赛第一场 set 1 无限完全二叉树的层次遍历,布布扣,bubuko.com

13年10月 月赛第一场 set 1 无限完全二叉树的层次遍历

原文:http://www.cnblogs.com/xinsheng/p/3575676.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!