刚接触到这个题目,先想到的是中序遍历解决。
void inorder(BSTnode* p)
{
if(p == 0)
{
return;
}
if(p->m_left != 0)
{
inorder(p->m_left);
}
//convert(p);
if(p->m_right != 0)
{
inorder(p->m_right);
}
}
思路比较简单(复杂的咱也想不到)。从叶子结点开始解决,要不指针就指丢了。以最底层最左的一棵子树开始进行转换。
这棵子树这个时候就应该看成是三个没有关系的结点(遍历顺序关系已经存在),然后按照双向链表的链接关系,进行链接。如果考虑成左子树右子树和根的话,考虑起来就麻烦了。所以,遍历顺序是从左到右。然后,按照顺序把他们连起来。
定义指针:BSTnode* proot.
BSTnode* ppre = 0;
BSTnode* phead;
void convert(BSTnode* p)
{
p->m_left = ppre; //将p当前结点的左孩子指针(转成链表之后这个指针就是pre指针了,指向前一个结点)
//之所以如此赋值,是因为proot为函数之外的指针,它可以保存当前结点。
if(p->m_left == 0) //初始的情况
{
phead = p; //最左孩子,即为链表的头
}
else
{
ppr