关于二叉树的遍历

原始代码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);
    }
}
运行没毛病。

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

 

posted @ 2019-05-21 15:46  落叶满空山  阅读(137)  评论(0编辑  收藏  举报