BST(二叉搜索树)变成双向链表

来源:互联网 发布:动漫资讯网站知乎 编辑:程序博客网 时间:2024/06/06 01:57

刚接触到这个题目,先想到的是中序遍历解决。

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->m_left = ppre)//并且有了和下一个结点的链接(ppre->m_right = p)当前结点被保存留作下一次用。

这样,关键工作告终。

完善一下BST的插入,然后测试下。

完整的代码如下所示:

#include <iostream>using namespace std;struct BSTnode{int m_value;BSTnode* m_left;BSTnode* m_right;};BSTnode* ppre = 0;BSTnode* phead;void insert(BSTnode* &p, int value){if(p == 0){BSTnode* pnew = new BSTnode();pnew->m_left = 0;pnew->m_right = 0;pnew->m_value = value; p = pnew;}else{if(p->m_value > value){insert(p->m_left, value);}else if(p->m_value < value){insert(p->m_right, value);}else{cout << "The Same!" << endl;}}}void inorder(BSTnode* p){void convert(BSTnode* p);if(p == 0)return;inorder(p->m_left);convert(p);inorder(p->m_right);}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)赋值。cout << p->m_value << endl;}//经过这样的指针转换之后,当前结点有了和前一个结点的链接(p->m_left = ppre)//并且有了和下一个结点的链接(ppre->m_right = p)当前结点被保存留作下一次用。int main(void){BSTnode* root = 0; insert(root, 22);insert(root, 10);insert(root, 14);insert(root, 16);insert(root, 8);insert(root, 2);insert(root, 12);insert(root, 4);inorder(root);return 0;}


结果是2,4,8,10,12,14,16,22