树的直径、最近公共祖先、树的变形

简介: 树的直径、最近公共祖先、树的变形


树的直径

树的直径

https://leetcode.cn/problems/tree-diameter/

class Solution {
public:
    int treeDiameter(vector<vector<int>>& edges) {
        n = 0;
        for(vector<int>& edge : edges) {
            int x = edge[0];
            int y = edge[1];
            n = max(n, max(x, y));
        }
        n++;
        for(int i = 0; i < n; i++) to.push_back({});
        for(vector<int>& edge : edges) {
            int x = edge[0];
            int y = edge[1];
            to[x].push_back(y);
            to[y].push_back(x);
        }
        int p = findFarthest(0).first;
        return findFarthest(p).second;
    }
private:
    vector<vector<int>> to;
    int n;
    pair<int, int> findFarthest(int start) {
        vector<int> depth(n, -1);
        queue<int> q;
        q.push(start);
        depth[start] = 0;
        while(!q.empty()) {
            int x = q.front();
            q.pop();
            for (int y : to[x]) {
                if (depth[y] != -1) continue;
                depth[y] = depth[x] + 1;
                q.push(y);
            }
        }
        int ans = start;
        for(int i = 0; i < n; i++)
            if(depth[i] > depth[ans]) ans = i;
        return {ans, depth[ans]};
    }
};

两次深度优先遍历

  • 第一次从任意一个点出发,找到距离它最远的点p
  • 第二次从p出发,找到距离它最远的点q
  • 连接p,q的路径即为树的直径

最近公共祖先(LCA)

236.二叉树的最近公共祖先

https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/

先求出父结点,然后用向上标记法

  • p向上一直到root标红色
  • q向上,第一次遇到红色时,就找到了LCA
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        this->p=p;
        this->q=q;
        dfs(root);
        return ans;
    }
private:
    TreeNode* ans;
    TreeNode* p;
    TreeNode* q;
    pair<bool,bool> dfs(TreeNode* root){
        if(root==nullptr) return {false,false};
        pair<bool,bool> leftResult = dfs(root->left);
        pair<bool,bool> rightResult = dfs(root->right);
        pair<bool,bool> result;
        result.first = leftResult.first || rightResult.first || root==p;
        result.second = leftResult.second || rightResult.second || root==q;
        if(result.first && result.second && ans==nullptr) ans=root;
        return result;
    }
};

基环树

向一棵树添加一条边,就形成了一个环

此时整个结构被称为基环树( pseudotree / unicyclic graph)

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

相关文章
|
存储 算法
【每日挠头算法题(9)】二叉树的直径|二叉树的层序遍历
【每日挠头算法题(9)】二叉树的直径|二叉树的层序遍历
|
8月前
|
算法 程序员
【算法训练-二叉树 三】【最大深度与直径】求二叉树的最大深度、求二叉树的直径
【算法训练-二叉树 三】【最大深度与直径】求二叉树的最大深度、求二叉树的直径
76 0
|
7月前
|
Python
如何画一棵树
如何画一棵树
|
7月前
|
算法 Java
二叉树递归分形,牛顿分形图案
二叉树递归分形,牛顿分形图案
47 0
|
8月前
|
人工智能 算法 BI
【深度优先搜索】【C++算法】834 树中距离之和
【深度优先搜索】【C++算法】834 树中距离之和
|
8月前
|
机器学习/深度学习 测试技术
【图论】【状态压缩】【树】【深度优先搜索】1617. 统计子树中城市之间最大距离
【图论】【状态压缩】【树】【深度优先搜索】1617. 统计子树中城市之间最大距离
|
8月前
|
存储 算法
哈夫曼树(赫夫曼树、最优树)详解
哈夫曼树(赫夫曼树、最优树)详解
179 0
|
8月前
|
算法
树的深度优先和广度优先
树的深度优先和广度优先
47 0
|
算法
|
机器学习/深度学习 存储 算法

热门文章

最新文章

下一篇
开通oss服务