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;
}