C数据结构-图-记录父亲节点

leetcode742题,二叉树最近的叶节点。
给出某二叉树,给出某个值k,找到最接近的叶子节点。
做发可能不是真正的图,算是个开头吧,有缘更新。
1、因为每个节点的值都是独一无二的,可以申请1000的数组,来存值为K的节点的关系:包括父亲是谁,是否是叶子节点,当前距离顶点的距离是多少
2、找出每个节点到顶点的距离,父亲是谁,遍历的时候顺便标记是否是叶子节点
3、遍历出叶子节点,找出当前节点i和k的距离,记录最小值

#define MAXLEN 1002
typedef struct{
    int dis;
    int state;
    int father;
}Node;
Node g_node[MAXLEN];

void GetDis(struct TreeNode* root, int dis) {
    if (root == NULL) {
        return;
    }
    g_node[root->val].dis = dis;
    if (root->left == NULL &&  root->right == NULL) {
        g_node[root->val].state = 1;
    }
    if (root->left != NULL){
        GetDis(root->left,dis + 1); 
        g_node[root->left->val].father = root->val; 
    } 
    if (root->right != NULL){
        GetDis(root->right,dis + 1); 
        g_node[root->right->val].father = root->val; 
    }    
    return;
}

int Find(int i, int k)
{   
    int max = g_node[i].dis > g_node[k].dis ? i : k; 
    int min = g_node[i].dis > g_node[k].dis ? k : i; 
    int gap = g_node[i].dis > g_node[k].dis ?  g_node[i].dis - g_node[k].dis : g_node[k].dis - g_node[i].dis;
    while (gap){
        max = g_node[max].father;
        gap--; 
    }
    //printf("i: %d  k: %d  min: %d  max: %d\n", i, k, min, max);
    while(max != min ) {
        max = g_node[max].father;
        min = g_node[min].father;
    }
    return g_node[i].dis + g_node[k].dis - 2 * g_node[max].dis;
}

int findClosestLeaf(struct TreeNode* root, int k){
    int i, min, ret, curr;
    min = -1;
    memset(g_node,0,sizeof(Node) * MAXLEN);
    GetDis(root, 0);
    for (i = 1; i < MAXLEN; i++){
        if (g_node[i].state == 1){
            curr = Find(i,k);
            //printf("i: %d  curr: %d\n", i, curr);
            if (min == -1 || (min > curr)) {
                min = curr;
                ret = i;
            }
        }
    }
    return ret;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值