面试题三十六:二叉搜索树与双向链表

 

输入一棵二叉搜索树,将该树转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整树中的指针指向
分析:使用中序遍历每一个节点,根节点和左子树的右子树相连,根节点再和右子树的最左子树相连

 

 BinaryTreeNode Convert( BinaryTreeNode pRootofTree ){
            //指向双向链表的尾结点
             BinaryTreeNode pLastNodeInList =null;
             ConvertNode(  pRootofTree, pLastNodeInList);
           //返回头结点
             BinaryTreeNode  phead =pLastNodeInList;
             while( phead!=null  phead.L!=null)
                    phead=phead.L;
             return phead;
    }
    
    //通过不断更新尾结点的位置从而达到目的
    //类似中序遍历,达到最左边设置为尾节点,再层层修改尾节点的位置
   
    void  ConvertNode( BinaryTreeNode pNode,BinaryTreeNode pLastNode){
            if( pNode==null) return ;
            
            BinaryTreeNode pCurrent =pNode;
            
           //遍历到最左边的最小数,叶子
            if(pCurrent .L!=null) 
                 ConvertNode( pCurrent .L , pLastNode);
             
             //使得左子树的右节点指向本节点,再把本节点设为尾结点
              pCurrent .L= pLastNode;
             if( pLastNode!=null)  
                    pLastNode.R=pCurrent;             
              pLastNode = pCurrent; 
            
            //操作右子树
            if(pCurrent .R!=null)
                 ConvertNode( pCurrent .R , pLastNode);


    
    }
    

 

posted @ 2020-03-29 15:08  浪波激泥  阅读(307)  评论(0编辑  收藏  举报