二叉树转链表

#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<list>
#include<vector>
#include<iterator>


using namespace std;

typedef struct _tree_node
{
    int m_nValue;
    struct _tree_node *m_pLeft;
    struct _tree_node *m_pRight;
}TreeNode;


TreeNode* createNode(int value)
{
     TreeNode* pNode=(TreeNode *)malloc(sizeof(TreeNode));
     assert(pNode!=NULL);
     pNode->m_nValue=value;
     pNode->m_pLeft=NULL;
     pNode->m_pRight=NULL;
     return pNode;
}

TreeNode* arrToTree(int *arr,int start,int end)
{
     TreeNode *pHead=NULL;
     if(end>=start)
     {
          int mid=(start+end)>>1;
          pHead=createNode(arr[mid]);
          pHead->m_pLeft=arrToTree(arr,start,mid-1);
          pHead->m_pRight=arrToTree(arr,mid+1,end);
     }   
     return pHead;
}

/*void printTree(TreeNode *pHead)
{
     if(pHead==NULL)
     return;
     printTree(pHead->m_pLeft);
     printf("%d ",pHead->m_nValue);
     printTree(pHead->m_pRight);
}*/

/*int getTreeHeight(TreeNode *pHead)
{
    if(pHead==NULL)
    return 0;
    return getTreeHeight(pHead->m_pLeft)>getTreeHeight(pHead->m_pRight)?getTreeHeight(pHead->m_pLeft)+1:getTreeHeight(pHead->m_pRight)+1;
}*/

vector< list<TreeNode *> > find_level_list(TreeNode *pHead)
{
    vector< list<TreeNode *> > res;
    int level=0;
    list<TreeNode *>li;
    li.push_back(pHead);
    res.push_back(li);
    
    while(!res[level].empty())
    {
        list<TreeNode *>l;
        list<TreeNode *>::iterator it;
        for(it=res[level].begin();it!=res[level].end();it++)
        {
            TreeNode *pNode=*it;
            if(pNode->m_pLeft)
            l.push_back(pNode->m_pLeft);
            if(pNode->m_pRight)
            l.push_back(pNode->m_pRight);
        }
        ++level;
        res.push_back(l);
    }
    
    return res;
}

void print(vector< list<TreeNode *> > res)
{
     vector< list<TreeNode *> >::iterator it_vec;
     for(it_vec=res.begin();it_vec!=res.end();it_vec++)
     {
         list<TreeNode *>li=*it_vec;
         list<TreeNode *>::iterator it_lis;
         for(it_lis=li.begin();it_lis!=li.end();it_lis++)
         {
             TreeNode *pNode=*it_lis;
             printf("%d ",pNode->m_nValue);
         }
     }
}

int main()
{
    int arr[]={0,1,2,3,4,5,6,7,8,9};
    int len=sizeof(arr)/sizeof(arr[0]);
    TreeNode *pHead=NULL;
    pHead=arrToTree(arr,0,len-1);
    
    vector< list<TreeNode *> >res;
    res=find_level_list(pHead);
    print(res);
        
    system("pause");
    return 0;
}

posted @ 2013-09-16 15:08  liguigen  阅读(309)  评论(0编辑  收藏  举报