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

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

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

/**
 * struct TreeNode {
 *  int val;
 *  struct TreeNode *left;
 *  struct TreeNode *right;
 *  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
#include <algorithm>
#include <queue>
#include <unordered_map>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @param o1 int整型
     * @param o2 int整型
     * @return int整型
     */
    vector<int> find_path(TreeNode* root, int target) {
        queue<TreeNode*> q;
        unordered_map<TreeNode*, TreeNode*> parents;
        q.push(root);
        vector<int> path;
        while (!q.empty()) {
            TreeNode* current = q.front();
            q.pop();
            if (current->left) {
                q.push(current->left);
                parents[current->left] = current;
            }
            if (current->right) {
                q.push(current->right);
                parents[current->right] = current;
            }
            if (current->val == target) {
                TreeNode* node = current;
                while (node) {
                    path.push_back(node->val);
                    node = parents[node];
                }
                break;
            }
        }
        reverse(path.begin(), path.end());
        return path;
    }
    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        // write code here
        int ans;
        vector<int> patho1 = find_path(root, o1);
        vector<int> patho2 = find_path(root, o2);
        int i = 0;
        int j = 0;
        while (i < patho1.size() && j < patho2.size()) {
            if (patho1[i] == patho2[j]) {
                ans = patho1[i];
            }
            i++;
            j++;
        }
        return ans;
    }
};

寻找二叉树里的任意两个节点的最近公共祖先节点。

思路总结:

1.先通过广度优先算法,输出各自从root节点到目标节点的路径。

2.循环对比两者的路径,返回最后一个相等的节点值

ps:寻找路径时,广度优先可以借助队列queue的先进先出原则,进行实现。

节点之间的父子关系可以借助无序的字典 unordered_map<> parents 实现父子之间的联系

等找到目标节点后,循环遍历取出此节点以及他的父亲节点的数值,放于路径当中。

此时为儿子到父亲的路径,仍然需要reverse(begin(), end()),将路径反转

全部评论

相关推荐

01-26 22:20
已编辑
门头沟学院 Java
Java抽象带篮子:项目很nb了,现在好好准备八股和算法吧,早点找实习,可以看看我的置顶帖子。帖子里写了怎么改简历,怎么包装实习经历,还有2个高质量可速成的项目话术,和我的牛客八股笔记专栏
点赞 评论 收藏
分享
点赞 评论 收藏
分享
sagima:然后这个帖子又登上了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务