C语言 | Leetcode C语言题解之第236题二叉树的最近公共祖先

题目:

题解:

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

typedef struct road_t
{
    struct TreeNode *road_node; // 途径路径
    struct road_t *p_next;
}ROAD_T;

int road_fill(struct TreeNode* root, struct TreeNode* p, ROAD_T *road_node_now) // 路径填充
{
    ROAD_T *new_node = NULL;
    int flag = 0;

    if(!root)
    {
        return 0;
    }

    if(root == p) // 找到节点置起标志位,将途径路径存储
    {
        flag = 1;
    }

    flag |= road_fill(root->left, p, road_node_now);
    flag |= road_fill(root->right, p, road_node_now);

    if(flag)
    {
        new_node = (ROAD_T *)malloc(1 * sizeof(ROAD_T));
        if(!new_node)
        {
            printf("open space error");
            exit(0);
        }
        new_node->road_node = root;
        new_node->p_next = road_node_now->p_next;
        road_node_now->p_next = new_node;

        return flag;
    }

    return 0;
}

struct TreeNode *find_sncestor(ROAD_T *road_head_p, ROAD_T *road_head_q) // 寻找公共节点
{
    ROAD_T *now_p_node = road_head_p->p_next;
    ROAD_T *now_q_node = road_head_q->p_next;
    ROAD_T *last_same_node = NULL;

    while(now_p_node)
    {
        now_q_node = road_head_q;
        while(now_q_node)
        {
            if(now_p_node->road_node == now_q_node->road_node)
            {
                last_same_node = now_p_node->road_node;
            }
            now_q_node = now_q_node->p_next;
        }
        now_p_node = now_p_node->p_next;
    }

    return last_same_node;
}

struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {
    ROAD_T *road_head_p = (ROAD_T *)calloc(1, sizeof(ROAD_T));
    ROAD_T *road_head_q = (ROAD_T *)calloc(1, sizeof(ROAD_T));
    if(!road_head_q || !road_head_p)
    {
        printf("open space error");
        exit(0);
    }

    road_fill(root, p, road_head_p); // 新建p节点路径
    road_fill(root, q, road_head_q); // 新建q节点路径

    return find_sncestor(road_head_p, road_head_q);
}
相关推荐
山脚ice21 分钟前
【Hot100】LeetCode—5. 最长回文子串
算法·leetcode
桃酥40343 分钟前
贪心算法day29|134. 加油站(理解有难度)、135. 分发糖果、860. 柠檬水找零、406. 根据身高重建队列
c++·算法·leetcode·贪心算法·代码随想录
长潇若雪1 小时前
《C Primer Plus》第 11 章复习题和编程练习
c语言·开发语言·经验分享
独領风萧2 小时前
数据结构之栈(数组实现)
c语言·数据结构
米饭「」3 小时前
C语言数据类型、变量及数据类型的长度、取值范围
c语言·开发语言
GoDve丨3 小时前
嵌入式初学-C语言-数据结构--七
服务器·c语言·开发语言·数据结构·b树·算法·链表
鱼跃鹰飞3 小时前
Leetcode面试经典150题-27.移除元素
算法·leetcode·面试
黒井深4 小时前
Visual Studio(vs)下载安装C/C++运行环境配置和基本使用注意事项
c语言·c++·ide·visual studio
.普通人4 小时前
c语言--力扣简单题目(最后一个单词的长度)讲解
c语言·算法·leetcode
干货没人看4 小时前
惩罚矩阵?动态规划是如何爱上矩阵的
c语言·c++·经验分享·算法