依然是上周的数据结构作业:
先说一下思路,要找两个结点的共同路径,就先分别求出两个结点的路径并储存
然后通过对比各自的路径找到共同路径,这里我感觉应该还可以拓展到多个结点
不过没有什么时间去 尝试
下面是我的代码:
头文件 宏定义 和结构:
这里按照题目要求,使用了同时含有双亲和左右孩子的结构,事实证明,有了双亲结点的话,计算结点的层数和寻找它的路径都变得十分简单
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct BiTNode
{ ElemType data;
struct BiTNode* left;
struct BiTNode* right;
struct BiTNode* parent;
}BiNode,*BiTree;
建立和销毁树
这里销毁树和普通的二叉链表树是一样的操作,
但是建立树的时候多了一个建立双亲结点的过程
int CreateTree(BiTree* root,BiTree p)//种树
{ int data;
scanf("%d",&data);
if(data<=0)
{ *root=NULL;
return 0;
}
*root=(BiTree)malloc(sizeof(BiNode));
if(!root){
printf("failed\n");
}
if(data>0){
(*root)->data=data;
(*root)->parent=p;
CreateTree(&((*root)->left),*root);
CreateTree(&((*root)->right),*root);
}
return 0;
}
void DestroyTree(BiTree root)
{ if(root)
{ if(root->left)
{ DestroyTree(root->left);
root->left=NULL;
}
if(root->right)
{ DestroyTree(root->right);
root->right=NULL;
}
}
}
寻找共同路径函数
一开始想写一个,后来发现好像有点弄不过来,就分成了三个函数,
第一个函数是用来计算这个结点所在的层数,这样向记录该节点路径的数组里添加元素时就可以使其按照从根结点到该节点的顺序而不是反序
ps或者可以不计算层数,另写一个函数用来把数组顺序重新排列感觉也可以
第二个函数用来提取这个结点的路径,里面直接调用了第一个函数
第三个函数就是我们所要的函数,先分别调用第二个函数提取路径,再进行对比获得共同路径。
int layer(BiTree p)
{ int i=1;
while(p->parent!=NULL)
{
i++;
p=p->parent;
}
return i;
}
void Road(int data[],BiTree p)
{ int i=layer(p);
for(;i>0;i--)
{ data[i-1]=p->data;
p=p->parent;
}
}
void SameRoad(int a[10],int b[10],BiTree p,BiTree q)
{ Road(a,p);
Road(b,q);
int i=0,j=0;
while(a[i]==b[j])
{
printf("%d\n",a[i]);
i++;
j++;
}
}
测试函数
int main()
{ BiTree root;
CreateTree(&root,NULL);
BiTree p=root->left->left->right;
BiTree q=root->left->right;
int a[10];
int b[10];
Road(a,p);
SameRoad(a,b,p,q);
return 0;
}
输入和输出: