刚接触到这个题目,先想到的是中序遍历解决。
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
{
ppre->m_right = p; //假设为第二个结点,则proot(指向的是前一次的当前结点,看下一行代码)的m_right指针指向它。
}
ppre = p; //当前结点保存到proot中,留作给下一个结点的左指针(pre)赋值。
}
//经过这样的指针转换之后,当前结点有了和前一个结点的链接(p

本文介绍了如何将BST(二叉搜索树)转换为双向链表。通过中序遍历,从最底层最左的子树开始,按照从左到右的顺序连接节点,形成双向链表。详细步骤包括定义指针、完善BST插入操作并进行测试。
最低0.47元/天 解锁文章
393

被折叠的 条评论
为什么被折叠?



