现在的位置: 首页 > 综合 > 正文

二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现(转)

2012年11月16日 ⁄ 综合 ⁄ 共 6816字 ⁄ 字号 评论关闭

后序遍历还没有明白,继续学习^_^,过几天写个huffman编码的例子来玩玩,不多说了,看代码吧,注意:程序申请的空间并没有释放^_^


/*
*******************************************************************

    created:    2005/12/30

    created:    30:12:2005   10:39

    filename:     bintree.h

    author:        Liu Qi

    

    purpose:    二叉树的3种遍历方式(包括非递归实现),前序,后序和中序,先访问根节点就是

    前序(部分书籍称为先根遍历,个人觉得该说法更好^_^),类似的,最后访问根节点就是后序

********************************************************************

*/





#ifndef TREE_H

#define
 TREE_H




#include 

<
stdio.h
>


#include 

<
malloc.h
>


#include 

<
stack
>


#include 

<
queue
>


#include 

<
assert.h
>



using
 
namespace
 std;




typedef 

int
 ElemType;


typedef 

struct
 treeT


{

    ElemType key;

    

struct
 treeT
*
 left;

    

struct
 treeT
*
 right;

}


treeT, 
*
pTreeT;






/*
===========================================================================

* Function name:    visit

* Parameter:        root:树根节点指针

* Precondition:        

* Description:        

* Return value:        

* Author:            Liu Qi, //-

===========================================================================

*/



static
 
void
 visit(pTreeT root)


{

    

if
 (NULL 
!=
 root)

    


{

        printf(

"
 %d/n
"
, root
->
key);

    }




}








/*
===========================================================================

* Function name:  BT_MakeNode    

* Parameter:      target:元素值    

* Precondition:      None    

* Postcondition:  NULL != pTreeT 

* Description:      构造一个tree节点,置左右指针为空,并且返回指向新节点的指针    

* Return value:      指向新节点的指针    

* Author:            Liu Qi,  [12/30/2005]

===========================================================================

*/



static
 pTreeT BT_MakeNode(ElemType target)


{

    pTreeT pNode 

=
 (pTreeT) malloc(
sizeof
(treeT));


    assert( NULL 

!=
 pNode ); 


    pNode

->
key   
=
 target;

    pNode

->
left  
=
 NULL;

    pNode

->
right 
=
 NULL;

    

    

return
 pNode;

}







/*
===========================================================================

* Function name:    BT_Insert

* Parameter:        target:要插入的元素值, pNode:指向某一个节点的指针

* Precondition:         NULL != ppTree 

* Description:        插入target到pNode的后面

* Return value:        指向新节点的指针

* Author:            Liu Qi,  [12/29/2005]

===========================================================================

*/



pTreeT BT_Insert(ElemType target, pTreeT

*
 ppTree)


{

    pTreeT Node;


    assert( NULL 

!=
 ppTree ); 


    Node 

=
 
*
ppTree;

    

if
 (NULL 
==
 Node)

    


{

        

return
 
*
ppTree 
=
 BT_MakeNode(target);

    }





    

if
 (Node
->
key 
==
 target)    
//
不允许出现相同的元素


    

{

        

return
 NULL;

    }




    

else
 
if
 (Node
->
key 
>
 target)    
//
向左


    

{

        

return
 BT_Insert(target, 
&
Node
->
left);

    }




    

else


    


{

        

return
 BT_Insert(target, 
&
Node
->
right);

    }




}









/*
===========================================================================

* Function name:    BT_PreOrder

* Parameter:        root:树根节点指针

* Precondition:        None

* Description:        前序遍历

* Return value:        void

* Author:            Liu Qi,  [12/29/2005]

===========================================================================

*/



void
 BT_PreOrder(pTreeT root)


{

    

if
 (NULL 
!=
 root)

    


{

        visit(root);

        BT_PreOrder(root

->
left);

        BT_PreOrder(root

->
right);

    }


    

}







/*
===========================================================================

* Function name:    BT_PreOrderNoRec

* Parameter:        root:树根节点指针

* Precondition:        Node

* Description:        前序(先根)遍历非递归算法

* Return value:        void

* Author:            Liu Qi,  [1/1/2006]

===========================================================================

*/



void
 BT_PreOrderNoRec(pTreeT root)


{

    stack

<
treeT 
*>
 s;


    

while
 ((NULL 
!=
 root) 
||
 
!
s.empty())

    


{

        

if
 (NULL 
!=
 root)

        


{

            visit(root);

            s.push(root);

            root 

=
 root
->
left;

        }




        

else


        


{

            root 

=
 s.top();

            s.pop();

            root 

=
 root
->
right;

        }




    }




}








/*
===========================================================================

* Function name:    BT_InOrder

* Parameter:        root:树根节点指针

* Precondition:        None

* Description:        中序遍历

* Return value:        void

* Author:            Liu Qi,  [12/30/2005]

===========================================================================

*/



void
 BT_InOrder(pTreeT root)


{

    

if
 (NULL 
!=
 root)

    


{

        BT_InOrder(root

->
left);

        visit(root);

        BT_InOrder(root

->
right);

    }




}







/*
===========================================================================

* Function name:    BT_InOrderNoRec

* Parameter:        root:树根节点指针

* Precondition:        None

* Description:        中序遍历,非递归算法

* Return value:        void

* Author:            Liu Qi,  [1/1/2006]

===========================================================================

*/



void
 BT_InOrderNoRec(pTreeT root)


{

    stack

<
treeT 
*>
 s;

    

while
 ((NULL 
!=
 root) 
||
 
!
s.empty())

    


{

        

if
 (NULL 
!=
 root)

        


{

            s.push(root);

            root 

=
 root
->
left;

        }




        

else


        


{

            root 

=
 s.top();

            visit(root);

            s.pop();

            root 

=
 root
->
right;

        }




    }




}








/*
===========================================================================

* Function name:    BT_PostOrder

* Parameter:        root:树根节点指针

* Precondition:        None

* Description:        后序遍历

* Return value:        void

* Author:            Liu Qi,  [12/30/2005]

===========================================================================

*/



void
 BT_PostOrder(pTreeT root)


{

    

if
 (NULL 
!=
 root)

    


{

        BT_PostOrder(root

->
left);

        BT_PostOrder(root

->
right);

        visit(root);    

    }




}







/*
===========================================================================

* Function name:    BT_PostOrderNoRec

* Parameter:        root:树根节点指针

* Precondition:        None

* Description:        后序遍历,非递归算法

* Return value:        void

* Author:            Liu Qi, //  [1/1/2006]

===========================================================================

*/



void BT_PostOrderNoRec(pTreeT root)
{
    stack<treeT *> s;
    pTreeT pre=NULL;
   
    while ((NULL != root) || !s.empty())
    {
        if (NULL != root)
        {
            s.push(root);
            root = root->left;
        }
        else
        {
            root = s.top();
            if (root->right!=NULL && pre!=root->right)
            {
                root=root->right;
            }
            else
            {
                root=pre=s.top();
                visit(root);
                s.pop();
                root=NULL;
            }
        }
    }
}






/*
===========================================================================

* Function name:    BT_LevelOrder

* Parameter:        root:树根节点指针

* Precondition:        NULL != root

* Description:        层序遍历

* Return value:        void

* Author:            Liu Qi,  [1/1/2006]

===========================================================================

*/



void
 BT_LevelOrder(pTreeT root)


{

    queue

<
treeT 
*>
 q;

    treeT 

*
treePtr;


    assert( NULL 

!=
 root ); 


    q.push(root);


    

while
 (
!
q.empty())

    


{

        treePtr 

=
 q.front();

        q.pop();

        visit(treePtr);


        

if
 (NULL 
!=
 treePtr
->
left)

抱歉!评论已关闭.