• 返回结点值为e的二叉树指针


    题意为,如果二叉树某结点的值为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;
    }
  • 相关阅读:
    [转]Intellij IDEA快捷键与使用小技巧
    Swoole来实现实时异步任务队列
    php 异步执行脚本
    Centos 7 systemctl和防火墙firewalld命令
    tgz的解压
    error: C++ preprocessor "/lib/cpp" fails sanity check错误解决方法
    Linux 命令详解(三)./configure、make、make install 命令
    LNMP, CentOS7.0+Nginx+Mysql5.7+PHP7环境安装
    phpmailer使用qq邮箱、163邮箱成功发送邮件实例代码
    Mibew Messenger (also known as Open Web Messenger)
  • 原文地址:https://www.cnblogs.com/tinaluo/p/5237136.html
Copyright © 2020-2023  润新知