您的位置:首页 > 其它

把搜索二叉树转换成双向链表

2013-12-14 21:05 246 查看
题目来自<<剑指offer>>,这个是本人的代码,和原书不一样.

思想:利用中序遍历中的递归思路,先转换左子树,然后转换右子树,然后就转换完成.这里关键点是传入一个前驱指针,用于和当前节点的连接.

代码:

//这里要特别注意一点:prev的值必须有指向,即不能为空,否则,会造成值传递,从而错误.
//其实这里改成指针的引用比较好.
//void convert(BST_node *pRoot,BST_node** prev)
//{
//    if ( pRoot ){
//        convert(pRoot->m_pLeft,prev);
//        pRoot->m_pLeft = *prev;
//
//        if ( *prev ){
//            (*prev)->m_pRight = pRoot;
//        }
//
//        pRoot->m_pLeft =*prev;
//
//        *prev = pRoot;
//        convert(pRoot->m_pRight,prev);
//    }
//}

//其实这里改成指针的引用版本.
void myconvert(BST_node *pRoot,BST_node*& prev)
{
if ( pRoot ){
myconvert(pRoot->m_pLeft,prev);
pRoot->m_pLeft = prev;

if ( prev ){
prev->m_pRight = pRoot;
}

pRoot->m_pLeft =prev;
prev = pRoot;
myconvert(pRoot->m_pRight,prev);
}
}


这里是测试代码(上接9种二叉树遍历的代码)

int main()
{
//int pre[]={1,2,4,7,3,5,6,8};
//int mid[]={4,7,2,1,5,3,8,6};
int pre[]={8,4,2,6,12,10,13};
int mid[]={2,4,6,8,10,12,13};
BST_node* pRoot = build_BST(pre,mid,7);
// print_preorder_reserve(pRoot);
// cout<<endl;
// print_preorder_noreserve(pRoot);
// print_preorder_nostack(pRoot);

/* print_inorder_reserve(pRoot);
cout<<endl;
print_inorder_noreserve(pRoot);
print_inorder_nostack(pRoot);*/

//print_postorder_noreserve(pRoot);
/* print_postorder_reserve(pRoot);
cout<<endl;
print_postorder_nostack(pRoot);*/

BST_node *prev = NULL;
myconvert(pRoot,prev);
for (  ; prev  ;prev=prev->m_pLeft ){
cout<<prev->m_value<<" ";
}

/*for (  ; (*prev)->m_pLeft  ; (*prev)=(*prev)->m_pLeft ){
cout<<(*prev)->m_value<<" ";
}*/
cout<<endl;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: