6.4.2 二叉树其它操作算法举例 五、在二叉树上查询某个结点 假设给定一个和二叉树中数据元素有相同类型的值,在已知二叉树中进行查找,若存在和给定值相同的数据元素,则返回函数值为 TRUE,并用引用参数返回指向该结点的指针;否则返回函数值为 FALSE。 算法的基本思想为: |
和其它结构一样,欲在已知结构中查询某个特定的数据元素,只需对此结构进行"遍历"即可,对于二叉树而言,沿任何一条搜索路径(包括层次遍历的搜索路径)进行搜索均可。若采用先左后右的搜索路径显然进行先序遍历最为直截了当。 你可能会想这个算法没有必要写得这么复杂,就对二叉树进行一遍遍历,遍历过程中判别是否存在这样的数据元素不就行了吗?那么下列算法是否正确? void locate(BiTree T,ElemType x,BiTree& p) { // 若二叉树 T 中存在和 x 相同的元素, // 则 p 指向该结点,否则 p = NULL if (!T) p=NULL; else { if (T->data==x) p=T; locate(T->lchild, x, p); locate(T->rchild, x, p); } } |
|||
void locate(BiTree T,ElemType x,BiTree& p) { // 若二叉树 T 中存在和 x 相同的元素,则 p 指向 // 该结点,否则 p 的值不变,p 的初值为 NULL if (T) { if (T->data==x) p=T; locate(T->lchild, x, p); locate(T->rchild, x, p); }// if } |
上面的这个算法不正确,不论二叉树中是否存在这个数据元素,最后返回的指针
p 都是"NULL"。应该修改成如左算法。 你只要仔细对比这两个算法的差异就能明白为什么上面这个算法是错的。 |