题解 | #在二叉树中找到两个节点的最近公共祖先#

在二叉树中找到两个节点的最近公共祖先

http://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116

写个倍增LCA
二叉树倍增按照2的次幂来增加, 即1, 2, 4, 8... 首先我们先预处理出每个节点2^j级祖先 用f[i][j] 表示i节点的2^j级祖先
查询时从大向小跳,即按照8, 4, 2, 1来;
具体:先把两个节点提到同一高度,在统一开始跳。一直跳到父亲节点相同,即为最近公共祖先。

/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    int f[100000][30];
    int  dep[100000];
// 预处理每个节点k级祖先
    void dfs(TreeNode* rt, int fa)
    {
        int x = rt->val;
        dep[x] = dep[fa] + 1;
        f[x][0] = fa;
        for (int i = 1; i <= 20; i ++ )
            f[x][i] = f[f[x][i-1]][i-1];
        if (rt->left)
        {
            dfs(rt->left, x);
        }
        if (rt->right) dfs(rt->right, x);
    }

    int Lca(int x, int y)
    {
        if (dep[x] < dep[y])
            swap(x, y);
        for (int i = 20; i >= 0; i -- )
            if (dep[f[x][i]] >= dep[y])
                x = f[x][i];
        if (x == y) return x;
        for (int i = 20; i >= 0; i -- )
        {
            if (f[x][i] != f[y][i])
                x = f[x][i], y = f[y][i];
        }
        return f[x][0];
    }

    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        dfs(root, root->val);
        return Lca(o1, o2);
    }
};
全部评论

相关推荐

头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务