查找元素的位置
- C/C++ code
普通的完全二叉树是基于数组建立的, 目前的搜索算法不能做到 可以搜索到下标。。。。。我想实现的功能,可以返回目标元素所在数组的索引。struct node{ node* lchild; node* rchild; int data; node():lchild(NULL),rchild(NULL){} node(int val):data(val),lchild(NULL),rchild(NULL){}};class BiTree{ node* root;public: BiTree():root(NULL){} ~BiTree(){ Clear(); } node* find(int data) const //这个函数目前不能返回data所在的数组中的索引位置,我想获得其位置,怎么修改啊?? { return search(root,data); }private: node* search(node* p, int data) const { node* pret; if(p==NULL)return p; if(p->data==data) return p; //左子树搜索 if(p->lchild) { pret=search(p->lchild,data); if(pret) return pret; } if(p->rchild) { pret=search(p->rchild,data); if(pret) return pret; } return NULL; }};[解决办法]
2叉树和数组完全是2个概念。普通的2叉树的节点是动态分配的,各个节点的地址没有必然的联系,而数组是有序表。在你的代码中,2叉树就是一颗普通的树,节点的地址用指针表示,怎么可以和数组扯上关系了。
如果你的2叉数是用数组来表示的,节点的地址不用指针,而用数组下标(和堆排序中的堆一样)来表示,返回的自然是数组下标了。
一个逻辑概念(树,栈)可以有不同的实现,不用的实现有不同的特点。如果A种实现方法有特性Af,B种实现了有特性Bf,非要在A种实现中实现B种实现才可能有的特性,费力也可能做不到。
举个不恰当的例子。广告有2种实现,A种广告是平面媒体(发行在书上的),B种广告是电视媒体。A种广告的寻址方式是书名和页数,比如计算机世界月刊第5期18页,B种广告的寻址方式是电视台名和时间段。比如,湖南卫视晚上8点30分。如果你非要在看电视的时候,想用书名和页数的寻址方式来得到某个广告的地址,无异于缘木求鱼。