0x55AA 发表于 2014-12-30 16:13:15

【算法】二叉树的层次遍历

问题:
如何实现二叉树的层次遍历?
解析:
我们可以使用队列来解决这个问题
<1>将根节点压入队列
<2>判断队列是否为空
<3>不为空则获取队列最前端的元素,打印出该元素
<4>将该元素移除队列
<5>如果该元素有左孩子,则将其左孩子进入队列
<6>如果该元素有右孩子,则将其右孩子进入队列
主要函数如下所示:template<typename Type> void BSTrees<Type>::traverseLevel(Node* root)
{
        if( root == NULL)
        {
                cout<<"This is a empty tree"<<endl;
                return;
        }
        queue<Node*> que;
        que.push(root);
        while( !que.empty() )
        {
                Node* ptr = que.front();
                que.pop();
                cout<<ptr->e<<endl;
                if(ptr->leftChild != NULL)
                        que.push(ptr->leftChild);
                if(ptr->rightChild != NULL)
                        que.push(ptr->rightChild);
        }
}整个程序如下所示:
BSTrees.h
//BSTrees.h
#ifndef DDXX_BSTREES_H
#define DDXX_BSTREES_H
#include <iostream>
#include <queue>
using namespace std;
template<typename Type>
class BSTrees
{
public:
        BSTrees();
        ~BSTrees();
public:
        struct Node
        {
                Type    e;
                Node*   leftChild;
                Node*   rightChild;
                Node()
                {
                }
                Node(Type _e)
                {
                        e         = _e;
                        leftChild   = NULL;
                        rightChild= NULL;
                }
        };
public:
        bool    insert(Type e);
        bool    erase1(Type e);
        bool    erase2(Type e);
        void    clear();
        bool    isEmpty();
        int   getLength();
        Node*   find(Type e);
        Node*   getRoot();
        Node*   getParent(Node* p);
        void    traverse(Node* ptr);
        void    traverseLevel(Node* ptr);
private:
        void    clears(Node* &p);
private:
        Node*   m_root;
        int   m_Length;
};

template<typename Type> BSTrees<Type>::BSTrees()
{
        m_root = NULL;
        m_Length = 0;
}

template<typename Type> bool BSTrees<Type>::insert(Type e)
{
        Node* ptr = new Node(e);
        if ( ptr == NULL )
        {
                cout<<"Allocate memory for the element failed"<<endl;
                return false;
        }

        if( m_root == NULL)
        {
                m_root = ptr;
                m_Length++;
                return true;
        }

        Node* p         = m_root;
        Node* pParent   = m_root;
        while( p != NULL)
        {
                if( e == p->e)
                {
                        cout<<"the element is already exist"<<endl;
                        delete ptr;
                        ptr = NULL;
                        return false;
                }

                pParent = p;
                if( e > p->e)
                {
                        p = p->rightChild;
                }
                else
                {
                        p = p->leftChild;
                }
        }

        if( e < pParent->e )
        {
                pParent->leftChild = ptr;
        }
        if( e > pParent->e)
        {
                pParent->rightChild = ptr;
        }

        m_Length++;
        return true;
}

template<typename Type> bool BSTrees<Type>::erase1(Type e)
{
        Node *p = find(e);
        if ( p == NULL )
        {
                cout<<"There's no this element to delete"<<endl;
                return false;
        }

        if ( p->leftChild == NULL)
        {
                Node* pParent = getParent(p);
                if( pParent->leftChild == p )
                        pParent->leftChild = p->rightChild;
                else
                        pParent->rightChild = p->rightChild;
                delete p;
                p = NULL;

                m_Length--;
                return true;
        }

        if ( p->rightChild == NULL)
        {
                Node* pParent = getParent(p);
                if( pParent->leftChild == p)
                        pParent->leftChild = p->leftChild;
                else
                        pParent->rightChild = p->leftChild;
                delete p;
                p = NULL;

                m_Length--;
                return true;
        }

        if ( p->leftChild != NULL && p->rightChild != NULL)
        {
                Node* pParent = getParent(p);
                Node* pPre = p->leftChild;
                Node* ptmp = pPre;
                while( pPre->rightChild != NULL )
                {
                        ptmp = pPre;
                        pPre = pPre->rightChild;
                }
                if( ptmp != pPre)
                {   ptmp->rightChild = pPre->leftChild;
                        pPre->leftChild = p->leftChild;
                        pPre->rightChild = p->rightChild;
                }
                else
                        pPre->rightChild = p->rightChild;

                if( pParent == NULL )
                        m_root = pPre;
                else
                        if( pParent->leftChild == p)
                                pParent->leftChild = pPre;
                        else
                                pParent->rightChild = pPre;

                delete p;
                p = NULL;

                m_Length--;
                return true;
        }

}

template<typename Type> boolBSTrees<Type>::erase2(Type e)
{
        Node *p = find(e);
        if ( p == NULL )
        {
                cout<<"There's no this element to delete"<<endl;
                return false;
        }

        if ( p->leftChild == NULL)
        {
                Node* pParent = getParent(p);
                if( pParent->leftChild == p )
                        pParent->leftChild = p->rightChild;
                else
                        pParent->rightChild = p->rightChild;
                delete p;
                p = NULL;

                m_Length--;
                return true;
        }

        if ( p->rightChild == NULL)
        {
                Node* pParent = getParent(p);
                if( pParent->leftChild == p)
                        pParent->leftChild = p->leftChild;
                else
                        pParent->rightChild = p->leftChild;
                delete p;
                p = NULL;

                m_Length--;
                return true;
        }
        if( p->leftChild != NULL && p->rightChild != NULL)
        {
                Node* pParent = getParent(p);
                Node* ptr = p->leftChild;
                while( ptr->rightChild != NULL )
                        ptr = ptr->rightChild;
                ptr->rightChild = p->rightChild;

                if( pParent == NULL )
                        m_root = p->leftChild;
                else
                        if(pParent->leftChild == p)
                                pParent->leftChild = p->leftChild;
                        else
                                pParent->rightChild = p->leftChild;
                delete p;
                p = NULL;
                m_Length--;
                return true;
        }
}

template<typename Type> voidBSTrees<Type>::clear()
{
        if( m_root == NULL )
                return;
        clears(m_root);
        m_root = NULL;
}

template<typename Type> void   BSTrees<Type>::clears(Node* &p)
{
        if(p->leftChild != NULL)
        {
                clears(p->leftChild);
                p->leftChild = NULL;
        }
        if(p->rightChild != NULL)
        {
                clears(p->rightChild);
                p->rightChild = NULL;
        }
        delete p;
        p = NULL;
        m_Length--;

}
template<typename Type> typename BSTrees<Type>::Node* BSTrees<Type>::getRoot()
{
        return m_root;
}
template<typename Type> int       BSTrees<Type>::getLength()
{
        return m_Length;
}
template<typename Type> typename BSTrees<Type>::Node* BSTrees<Type>::getParent(Node* p)
{
        if( p == m_root)
                return NULL;
        Node* ptr = m_root;
        Node* ptf = ptr;
        while( ptr != NULL )
        {
                if ( ptr->e == p->e )
                        return ptf;
                if ( ptr->e > p->e )
                {
                        ptf = ptr;
                        ptr = ptr->leftChild;
                }
                else
                {
                        ptf = ptr;
                        ptr = ptr->rightChild;
                }
        }

}

template<typename Type> typename BSTrees<Type>::Node* BSTrees<Type>::find(Type e)
{
        Node* ptr = m_root;

        while(ptr != NULL)
        {
                if ( ptr->e == e )
                        return ptr;
                if ( ptr->e > e )
                        ptr = ptr->leftChild;
                else
                        ptr = ptr->rightChild;
        }
        //if ( ptr == NULL )
        return NULL;
}

template<typename Type> void BSTrees<Type>::traverse(Node* ptr)
{
        if( ptr == NULL )
                return;
        if( ptr->leftChild != NULL )
                traverse(ptr->leftChild);
        cout<<"Element value:"<<ptr->e<<endl;
        if( ptr->rightChild != NULL )
                traverse(ptr->rightChild);
}

template<typename Type> void BSTrees<Type>::traverseLevel(Node* root)
{
        if( root == NULL)
        {
                cout<<"This is a empty tree"<<endl;
                return;
        }
        queue<Node*> que;
        que.push(root);
        while( !que.empty() )
        {
                Node* ptr = que.front();
                que.pop();
                cout<<ptr->e<<endl;
                if(ptr->leftChild != NULL)
                        que.push(ptr->leftChild);
                if(ptr->rightChild != NULL)
                        que.push(ptr->rightChild);
        }
}
template<typename Type> BSTrees<Type>::~BSTrees()
{
        clear();
}
#endifmain.cpp
//main.cpp
#include <iostream>
#include "BST.h"
using namespace std;


void main()
{
        BSTrees<int>Bst;
        int Arr = {6,2,8,4,10,0,12,16,14};
        for (int i=0;i<9;i++)
                Bst.insert(Arr);
        Bst.traverse(Bst.getRoot());
        cout<<"Tree'slength is:"<<Bst.getLength()<<endl;
        Bst.traverseLevel(Bst.getRoot());
}
页: [1]
查看完整版本: 【算法】二叉树的层次遍历