免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1545 | 回复: 0
打印 上一主题 下一主题

[C++] 二叉树输出指定路径 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-26 20:22 |只看该作者 |倒序浏览
请教各位高手...
//输出从根到指定值间的所有元素
#include <iostream>
#include <assert.h>
using namespace std;

template<class Telem> class Btree;
template<class Telem>
class BtreeNode
{
private:
&nbsp;&nbsp;&nbsp;&nbsp;Telem data;
&nbsp;&nbsp;&nbsp;&nbsp;BtreeNode<Telem>* lchild;
&nbsp;&nbsp;&nbsp;&nbsp;BtreeNode<Telem>* rchild;
&nbsp;&nbsp;&nbsp;&nbsp;friend class Btree<Telem>;
public:
&nbsp;&nbsp;&nbsp;&nbsp;BtreeNode(Telem el=0,BtreeNode<Telem>* l=NULL,BtreeNode<Telem>* r=NULL):data(el),lchild(l),rchild(r)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;void setdata(Telem el)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data=el;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;void setlchild(BtreeNode<Telem>* l)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lchild=l;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;void setrchild(BtreeNode<Telem>* r)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rchild=r;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;Telem getdata()
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return data;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;BtreeNode<Telem>* getlchild()
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return lchild;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;BtreeNode<Telem>* getrchild()
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return rchild;
&nbsp;&nbsp;&nbsp;&nbsp;}
};

template<class Telem>
class Btree
{
private:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BtreeNode<Telem>* root;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Telem* a;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int n;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BtreeNode<Telem>* build(int i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BtreeNode<Telem>* a1[10];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i;
public:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Btree();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Btree(Telem a[],int n);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void test(BtreeNode<Telem>* p,Telem a,BtreeNode<Telem>* array[]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void test(Telem x);
};

template<class Telem>
Btree<Telem>::Btree()
{
&nbsp;&nbsp;&nbsp;&nbsp;root=NULL;
}

template<class Telem>
Btree<Telem>::Btree(Telem a[],int n)
{
&nbsp;&nbsp;&nbsp;&nbsp;this->a=a;
&nbsp;&nbsp;&nbsp;&nbsp;this->n=n;
&nbsp;&nbsp;&nbsp;&nbsp;root=build(1);
}

template<class Telem>
BtreeNode<Telem>* Btree<Telem>::build(int i)
{
&nbsp;&nbsp;&nbsp;&nbsp;BtreeNode<Telem>* p;
&nbsp;&nbsp;&nbsp;&nbsp;int l=2*i; int r=2*i+1;
&nbsp;&nbsp;&nbsp;&nbsp;if(i<=n && a[i-1]!=0)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=new BtreeNode<Telem>();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p->data=a[i-1];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p->lchild=build(l);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p->rchild=build(r);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return p;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL;
}

template<class Telem>
void Btree<Telem>::test(Telem x)
{
&nbsp;&nbsp;&nbsp;&nbsp;for(int m=0;m<10;m++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a1[m]=NULL;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;i=0;
&nbsp;&nbsp;&nbsp;&nbsp;test(root,x,a1);
&nbsp;&nbsp;&nbsp;&nbsp;for(int j=0;a1[j]!=NULL;j++)       //输出数组中的元素       (1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout << a1[j]->data << " ";
&nbsp;&nbsp;&nbsp;&nbsp;cout << endl;
}

template<class Telem>
void Btree<Telem>::test(BtreeNode<Telem>* p,Telem a,BtreeNode<Telem>* array[])
{
&nbsp;&nbsp;&nbsp;&nbsp;array[i]=p;
&nbsp;&nbsp;&nbsp;&nbsp;i++;
&nbsp;&nbsp;&nbsp;&nbsp;if(p->data == a)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int j=0;j<i;j++)               //输出数组中的元素      (2)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout << array[j]->data << " ";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout << endl;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if(p->lchild != NULL)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test(p->lchild,a,array);
&nbsp;&nbsp;&nbsp;&nbsp;if(p->rchild != NULL)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test(p->rchild,a,array);
&nbsp;&nbsp;&nbsp;&nbsp;i--;
}

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;int a[]={1,2,3,4,5,6,7,8,9,10};
&nbsp;&nbsp;&nbsp;&nbsp;Btree<int> b(a,10);
&nbsp;&nbsp;&nbsp;&nbsp;b.test(9);
&nbsp;&nbsp;&nbsp;&nbsp;system("PAUSE");
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


问题:
原程序只有(1)处输出  结果不对之后  就在(2)处也加了输出(  (2)处本来只有return; 跳出递归 )
为什么(1)结果不对  (2)对  ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP