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
- BST(二叉搜索树)变成双向链表
- 平衡二叉搜索树BST转换为双向链表
- *BST(二叉搜索树)
- 二叉搜索树(BST)
- BST 二叉搜索树
- 二叉搜索树BST
- 二叉搜索树BST
- 二叉搜索树(BST)
- BST-搜索二叉树
- BST二叉搜索树
- 二叉搜索树与双向链表
- 二叉搜索树转为双向链表
- 二叉搜索树和双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- fedora17 安装视频解码器
- Linux 创建和删除swap file
- 常用的正则表达式
- js获取客户端计算机硬件信息与系统信息
- Codeblocks 在Linux下安装注意事项
- BST(二叉搜索树)变成双向链表
- 吞食鱼游戏蒙版图方法把鱼放到背景中
- 常用的正则表达式
- matlab基础学习(4)
- 12/11/17 百度PHP笔试题目整理
- 黑客伦理(Hacker Ethic)
- ASM(Active Shape Model)算法介绍
- Cocoa 编程之表格视图实例
- Linux中的工作队列