• 关于二叉树的遍历


    原始代码from: https://blog.csdn.net/Hu_weichen/article/details/80599994

    自己写了下:

    class BTNode
    {
    public:
        BTNode(){}
        ~BTNode(){}
        void frontTraverse(void);
        void middleTraverse(void);
        void rearTraverse(void);
        friend void createNodeTree(BTNode** T);
    private:
        char data;
        BTNode* mLeftChild;
        BTNode* mRightChild;
    };
    void BTNode::frontTraverse(void)
    {

        cout << data;

        if(mLeftChild)
        {
            mLeftChild->frontTraverse();
        }
        if(mRightChild != NULL)
        {
            mRightChild->frontTraverse();
        }
    }

    void BTNode::middleTraverse(void)
    {
        if(mLeftChild)
        {
            mLeftChild->middleTraverse();
        }
        cout << data;
        if(mRightChild)
        {
            mRightChild->middleTraverse();    
        }
    }

    void BTNode::rearTraverse(void)
    {
        if(mLeftChild)
        {
            mLeftChild->rearTraverse();
        }
        if(mRightChild)
        {
            mRightChild->rearTraverse();    
        }

        cout << data;
    }

    void createNodeTree(BTNode** T)
    {
        char ch;
        cin >> ch;
        if('#' == ch)
        {
            *T= NULL;
        }
        else
        {
            (*T)->data = ch;
            (*T)->mLeftChild = new BTNode;
            createNodeTree(&((*T)->mLeftChild));

            (*T)->mRightChild = new BTNode;
            createNodeTree(&((*T)->mRightChild));
        }
    }

    void main()
    {
        BTNode *T = new BTNode;
        createNodeTree(&T);
        if(T)
        {
            cout<<"前序:"<<endl;
            T->frontTraverse();
            cout<<"中序:"<<endl;
            T->middleTraverse();
            cout<<"后序:"<<endl;
            T->rearTraverse();
            system("pause");
        }
    }

    有一点区别就是博客上写的是跑不过的,因为这个create函数:

    void CreateBTree(BTNode * T)

    {

      char ch;

      cin >>ch;

       if ('#' == ch)

       {

         T=NULL;

       }

      else

      {

         T->data = ch;

         T->pLchild = new BTNode;

        CreateBTree(T->pLchild);

         T->pRchild = new BTNode;

        CreateBTree(T->pRchild);

       }

    }
    当输入#时,想的是将它的子树指针置为空,但由于传的参数是指针,实际T = NULL是不能改变外部的指针的地址的,也就是这步实际是不生效的,子树仍是一个非空的指针。那么有两种方法,一种是传多重指针,因为指针传参时其内容是可以被修改的,如果把我们想要置空的指针变成指针的内容,就可以实现,实现如上。

    另一种是传引用,方式如下:

    typedef BTNode (*pBTNode);  首先定义一个类指针

    friend void createNodeTree(pBTNode & T)  改为传指针的引用进去

    具体实现:

    void createNodeTree(pBTNode &T)
    {
        char ch;
        cin >> ch;
        if('#' == ch)
        {
            T= NULL;
        }
        else
        {
            T->data = ch;
            T->mLeftChild = new BTNode;
            createNodeTree(T->mLeftChild);

            T->mRightChild = new BTNode;
            createNodeTree(T->mRightChild);
        }
    }
    运行没毛病。

    这个例子对于递归,实际是出入栈,后进先出。对于指针传递与引用传递的理解是一个非常好的例子

  • 相关阅读:
    PL/SQL连接错误:ora-12705:cannot access NLS data files or invalid environment specified
    java 后台开发关键词解释
    架构、框架和设计模式关系(转)
    Web.xml配置详解
    SVN“验证位置时发生错误”的解决办法
    java遍历给定目录,树形结构输出所有文件,包括子目录中的文件
    android EditText 默认情况下不获取焦点(不弹出输入框)
    android listview item取消按点击效果
    如何实现可动态调整隐藏header的listview
    eclipse 启动到loading workbench... 自动关闭
  • 原文地址:https://www.cnblogs.com/doulcl/p/10900214.html
Copyright © 2020-2023  润新知