递归法找出某节点的所有父节点直到根节点
2010-06-23 20:16
162 查看
今天在C# and Java QQ群里看到有人在问如下一题:
“
出道题目啊,我的面试题,碰到2次了
sid pid
A NULL
B A
C NULL
D C
E D
F E
sid是子节点,pid是父节点,查出f的所有父节点,一直查到他的根节点为止 ”
要求用sql语句写出来,一时难倒一片。
仔细分析该题,实际上主要考查算法技巧,使用sql语句查询和高级语言实现算法基本一样。我们只要设计一个递归函数即可(sql语句也可以设计递归函数的),其基本算法如下:
我们假定需要查找strid的所有父节点则:
准备一个数组存储所有目标节点 ArrAllPids
将strid的所有父节点加入数组ArrAllPids
递归过程如下:
1) 找出strid的父节点strpid
2)如果strpid为NULL则退出递归,否则:
将strpid加入数组ArrAllPids
将strpid的所有父节点加入数组ArrAllPids中
此算法用sql语句或高级语言都可实现,为了调试方便我暂时用C++做了调试,结果正确代码如下:
#include<stdio.h>
#include<string.h>
struct ps
{
char sid[10];// 子节点
char pid[10];//父节点
};
struct ps AllPs[6]
=
{
"A","NULL",
"B","A",
"C" ,"NULL",
"D", "C",
"E", "D",
"F", "E"
};
int PSSize = 6;
//保存所有父节点
char ArrAllPids[50][10];
int pidSize = 0;
//将strpid的所有父节点加入数组AllAllPids中
void AddAllPidsToArr(char strid[])
{
//查找strsid的父节点到strpid中
char strpid[10];
for (int i=0;i<PSSize;i++)
{
if (!strcmp(AllPs[i].sid,strid))
{
strcpy(strpid,AllPs[i].pid);break;
}
}
//如果为NULL
if (!strcmp(strpid,"NULL"))
{
return;
}
else
{
strcpy(ArrAllPids[pidSize],strpid);//将strpid节点加入数组ArrAllPids中
pidSize++;
AddAllPidsToArr(strpid);//将strpid的所有父节点加入数组ArrAllPids中
}
}
void main()
{
AddAllPidsToArr("F");
for (int i=0;i<pidSize;i++)
{
printf("%s/n",ArrAllPids[i]);
}
}
“
出道题目啊,我的面试题,碰到2次了
sid pid
A NULL
B A
C NULL
D C
E D
F E
sid是子节点,pid是父节点,查出f的所有父节点,一直查到他的根节点为止 ”
要求用sql语句写出来,一时难倒一片。
仔细分析该题,实际上主要考查算法技巧,使用sql语句查询和高级语言实现算法基本一样。我们只要设计一个递归函数即可(sql语句也可以设计递归函数的),其基本算法如下:
我们假定需要查找strid的所有父节点则:
准备一个数组存储所有目标节点 ArrAllPids
将strid的所有父节点加入数组ArrAllPids
递归过程如下:
1) 找出strid的父节点strpid
2)如果strpid为NULL则退出递归,否则:
将strpid加入数组ArrAllPids
将strpid的所有父节点加入数组ArrAllPids中
此算法用sql语句或高级语言都可实现,为了调试方便我暂时用C++做了调试,结果正确代码如下:
#include<stdio.h>
#include<string.h>
struct ps
{
char sid[10];// 子节点
char pid[10];//父节点
};
struct ps AllPs[6]
=
{
"A","NULL",
"B","A",
"C" ,"NULL",
"D", "C",
"E", "D",
"F", "E"
};
int PSSize = 6;
//保存所有父节点
char ArrAllPids[50][10];
int pidSize = 0;
//将strpid的所有父节点加入数组AllAllPids中
void AddAllPidsToArr(char strid[])
{
//查找strsid的父节点到strpid中
char strpid[10];
for (int i=0;i<PSSize;i++)
{
if (!strcmp(AllPs[i].sid,strid))
{
strcpy(strpid,AllPs[i].pid);break;
}
}
//如果为NULL
if (!strcmp(strpid,"NULL"))
{
return;
}
else
{
strcpy(ArrAllPids[pidSize],strpid);//将strpid节点加入数组ArrAllPids中
pidSize++;
AddAllPidsToArr(strpid);//将strpid的所有父节点加入数组ArrAllPids中
}
}
void main()
{
AddAllPidsToArr("F");
for (int i=0;i<pidSize;i++)
{
printf("%s/n",ArrAllPids[i]);
}
}
相关文章推荐
- SqlServer找出所有的子节点,并按树形结构、层次查询
- 数据结构与算法[LeetCode]—找出N个节点的BST的所有形态组合
- 找出所有从根节点到叶子节点路径和等于n的路径并输出
- 找出二叉树中某个节点的所有祖先节点
- 找出二叉树所有到叶子节点的路径
- 找出所有从根节点到叶子节点路径和等于n的路径并输出
- 找出二叉树中某个节点的所有祖先节点
- 找出堆中小于某个值X的所有节点
- 递归法遍历xml文档所有节点。
- js找出页面宽度和高度大于某个值的所有节点
- 给定一棵二叉树,二叉树每个节点的值唯一,从根节点开始找出路径上的所有节点的节点值之和等于规定值的路径
- 在二元树中找出和为某一值的所有路径(根节点到任一节点的路径)
- python dataframe递归找出每个节点的所有父节点
- WPF中展开一个TreeView控件的所有树节点
- 读写xml所有节点个人小结 和 读取xml节点的数据
- jstree 默认展开所有节点方法
- [编程之美-03]在二元树中找出和为某一值的所有路径
- 二叉树中,找出和为某值的所有路径
- 删除父节点同时删除该节点上的所有子节点(oracle)
- WPF中展开一个TreeView控件的所有树节点