递归法找出某节点的所有父节点直到根节点

今天在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
#include

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    {
          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      {
          printf("%s/n",ArrAllPids[i]);
      }
}

 

你可能感兴趣的:(null,算法,sql,语言,struct,面试)