~$ 存档

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

题意为,如果二叉树某结点的值为e(假定是整型二叉树),返回这个结点的指针。初看这道题,联想到二叉树可以很简单的遍历,直接返回这个指针不就行了吗?
如下图所示,假如要返回值为3的结点指针:

设计好了一个函数

void Traverse(Tree &L,int e,Tree &q)
{
    if(L)
    {
        if(L->data==e)
        {
            cout<<"找到了"<<endl;
            q=L; /*辅助变量q保存指针*/
        }
        Traverse(L->left,e,q);
        Traverse(L->right,e,q);
    }
}

程序能正确运行,也确实返回了正确的指针值。可为什么书上没有采用这种方法呢?思考一下,不难发现这段程序的不利之处就在于,即使找到值之后它依然继续运行,一直遍历完整棵树!书上采用了一种非常巧妙的办法!

它的思路是,把结点放入队列,再检测该结点是否有左右子树,如果有,也放入队列。然后出列元素,看它的数据是否等于e,如此循环下去!
在这个循环中,判定的条件是:队列不为空!然后,出列元素(最左边),看它的值是否等于e,然后再检测它是否有左树,或者右树,如果有再入队列,这种方法很巧妙啊!

还有一个问题,就是这个队列需要多大的空间?规律是:出队一个,入队两个,(就按满二叉树的最多结点计算),所以队列中存在的结点数就会出现这种情况:
1  2  3  4  5  .........所以队列中的最大结点数就是,二叉树最底层的结点数,如,三层的满二叉树,底层有4个结点,则队列需要的节点最少为4,这样计算的原因是可能利用循环队列。

#include <iostream>
using namespace std;
#define MAXSIZE 16 
typedef struct node
{
    char data;
    struct node *left,*right;
}*Tree,Node;
void creat(Tree &T) /*创建二叉树*/
{
    char ch;
    scanf("%c",&ch);
    if(ch=='#')
    T=NULL;
    else
    {
        T=(Tree)malloc(sizeof(Node));
        T->data=ch;
        creat(T->left);
        creat(T->right);
    }
}

Tree LocateElem(Tree T,char e) /*查找=e的元素,返回其指针*/
{
    Tree Q[MAXSIZE];
    int front=0,rear=0;
    Tree p;
    if(T)
    {
        Q[rear]=T;
        rear++;
        while(front!=rear)/*队列不空*/
        {
            p=Q[front];/*出队*/
            front=(front+1)%MAXSIZE;
            if(p->data==e)/*如果找到*/
            return p;
            if(p->left)/*左树入队*/
            {
                Q[rear]=p->left;
                rear=(rear+1)%MAXSIZE;
            }
            if(p->right)/*右树入队*/
            {
                Q[rear]=p->right;
                rear=(rear+1)%MAXSIZE;
            }
        }
    }
    return NULL;
}
void DestoryTree(Tree &T)
{
    if(T)
    {
        DestoryTree(T->left);
        DestoryTree(T->right);
        free(T);
        T=NULL;
    }
}
int main()
{
    Tree q;
    Tree T;
    creat(T);
    if((q=LocateElem(T,'a'))!=NULL)/*返回指针*/
    cout<<q->data;
    else
    cout<<"没有找到数据值为e的元素!"<<endl;
    DestoryTree(T);
    return 0;
}

 

posted on 2016-03-03 01:54  LuoTian  阅读(613)  评论(0)    收藏  举报