题目来自<<剑指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;
}