请问求一棵树的任意一个接点的祖先接点怎么求??

beyondada 2005-11-30 07:07:20
清高手提供算法!!
递归和非递归都行!!
谢谢
...全文
308 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kid4you 2006-01-26
  • 打赏
  • 举报
回复
普通BTREE只有遍历所有节点
sailor_Song 2006-01-26
  • 打赏
  • 举报
回复
就是遍历树了,另外用一个栈来保存祖先,
zzwu 2006-01-26
  • 打赏
  • 举报
回复
同意 lxb365
f_acme 2006-01-01
  • 打赏
  • 举报
回复
树的结构中保存此节点的父节点,然后遍历就行了
Lynan 2005-12-29
  • 打赏
  • 举报
回复
不好意思,上面的函数名都一样,我拿一个现成算法改的,没改完全。
不过,最好还是根据需要设计相应的结构去实现算法。
Lynan 2005-12-29
  • 打赏
  • 举报
回复
同样同意 lxb365(靓声靓影)!
另外给你个递归算法
BiTree FindParent(Bitree T,Bitree p)
{
if(T==p)
{
found=TRUE;
return;
}
if(T->lchild) Findpath(T->lchild,p);
if(T->rchild&&!found) Findpath(T->rchild,p);
if(!found) return;
else return T;
}

sanhill 2005-12-04
  • 打赏
  • 举报
回复
同意 lxb365(靓声靓影)!
我以前做项目,树就是根据 父节点 来维系的,没有子孙孩子节点。
根据需要设计结构吧。
syy64 2005-12-04
  • 打赏
  • 举报
回复
类似GIS中路线拓扑查询原理。
lxb365 2005-12-04
  • 打赏
  • 举报
回复
在设计这个二叉树的结点的时候,多加一个指针,就是指向父结点的指针就可以了,这样会很方便。
TianGuangZao 2005-12-03
  • 打赏
  • 举报
回复
以下是我用 c++ 写的一段递归算法,未测试,仅作参考:

// t 为指向树根结点的指针,p 为指向任意结点的指针,pp 为指向父结点的引用型指针,
// 引用型标识位 finded 为 true 表示已经在某个位置找到
// 采用先序遍历递归算法,未验证
template <typename T>
bool BinaryTree<T>::Parent(BTNode<T>* t, const BTNode<T>* p, BTNode<T>*& pp, bool& finded)
{
if (t==NULL) return false; // 空树,返回 false
if (t==p) return false; // p 指向根结点,故无父结点,返回 false
if (t->lChild==p && t->rChild==p) { // 如果 p 为指向 t 的孩子结点的指针, 则 pp 即为 t
pp = t;
finded = true; // 设置标识位 finded 为 true,停止查找,逐层递归放回
return true;
}
Parent(t->lChild, p, pp); // 在左子树继续查找
if (!finded) // 如果在左子树没找到,则继续在右子树查找
Parent(t->rChild, p, pp);
}
beyondada 2005-12-03
  • 打赏
  • 举报
回复
普通二叉树的父节点!
有没有人提供递归的算法啊!!
sankt 2005-11-30
  • 打赏
  • 举报
回复
//p所指为任意一个节点,求出一个根节点到p所指节点之间路径的函数
//当然这条路径上的所有节点都是p节点的祖先
typedef struct tree
{
int data;//存放结点数据内容
struct tree *lchild,*rchild;
}btree; //声明新类型树结构
const int N=50;

typedef btree* b_tree;//声明二叉树的链表

void path(b_tree root,int x)
{
b_tree stack[N],p;
bool tag[N];
int top=-1,i;

p=root;

do
{
while(p!=NULL) //扫描左节点,入栈
{
++top;
stack[top]=p;
tag[top]=false;
p=p->lchild;
}

if(top>-1)
{
if(tag[top]==true) //左右节点都已经访问过
{
if(stack[top]->data==x) //该节点就是要找的节点
{
cout<<"The path is: "; //输出从栈底到栈顶的元素
for(i=0;i<=top;++i)
{
cout<<setw(5)<<stack[i]->data;

}
break;
cout<<endl;
}
--top;
}
else
{
p=stack[top];
if(top>-1)
{
p=p->rchild; //扫描右节点
tag[top]=true; //表示当前节点的右子树已经访问过
}
}
}
}while(p!=NULL || top !=-1);
}
cunsh 2005-11-30
  • 打赏
  • 举报
回复
树呢?
Kid4you 2005-11-30
  • 打赏
  • 举报
回复
普通二叉树就遍历吧...
dgzha 2005-11-30
  • 打赏
  • 举报
回复
你这个题意不清楚,是什么树,binary tree?

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧