二叉查找树转为双向链表
来源:互联网 发布:淘宝怎么申请天天特价 编辑:程序博客网 时间:2024/05/21 12:23
对于二叉查找树本能的想到了中序遍历,中序遍历二叉树的结果是有序的,只要使用非递归中序遍历,中间稍作修改应该就可以。这个是第一反应,觉得应该不难。
不过还是,网上搜索一下,在网易何海涛的技术博客中看到,关于递归的解法。这个方法虽然有些耗资源,但是我觉得第一个 想到的应该是这一个,应为二叉树本来就是递归结构,二叉树很多问题的解决都是从递归入手。
下面还是梳理一下这两个思路:
1、非递归方法:中序遍历二叉查找树的结果是有序的,写出二叉树的中序非递归算法,在每次访问该节点的时候,改为将节点加入链表。
2、递归方法:先将左子树形成链表,返回该链表的最后一个节点;再将右子树形成链表,并返回该链表的第一个节点;将左子树链表、节点、右子树链表连接起来,形成整个链表。
第一种思路代码:
Node* Tree::toList(){stack<Node *> stack;Node *p = root;Node *head = 0;Node *tail = 0;while (p != 0 || !stack.empty()) {while (p != 0) {stack.push(p);p = p->left;}p = stack.top();stack.pop();if (head == 0) {head = p;tail = p;} else {tail->right = p;p->left = tail;tail = p;}p = p->right;}return head;}
第二种思路的代码:
Node * Tree::convert(Node *node, bool isRight){if (node == 0)return 0;Node *pleft = 0;Node *pright = 0;if (node->left != 0) {pleft = convert(node->left, false);}if (pleft != 0) {node->left = pleft;pleft->right = node;}if (node->right != 0) {pright = convert(node->right, true);}if (pright != 0) {node->right = pright;pright->left = node;}Node *ptem;if (isRight) {while (node->left) node = node->left;ptem = node;} else {while (node->right != 0)node = node->right;ptem = node;}return ptem;}Node * Tree::convert(){return convert(root, true);}
参考:
http://zhedahht.blog.163.com/blog/static/254111742007127104759245/
- 二叉查找树转为双向链表
- 二叉查找树转为双向链表
- 二元查找树转为双向链表
- 【树】二叉树转为双向链表
- 二叉搜索树转为双向链表
- 二叉搜索树转为双向链表
- 搜索二叉树转为有序双向链表
- 有序二叉树转为有序双向链表
- 二叉搜索树转为双向链表(算法)
- 二叉查找树转双向链表
- 二叉树------二叉查找树转化为双向链表
- 将排序链表转为平衡二叉查找树
- 九:二叉搜索树与双向链表(二叉搜索树转为有序双向链表)
- 二叉查找树转变成有序的双向链表
- 二叉查找树 转换成 排序的双向链表
- 二叉查找树转双向链表(笔试)
- 把二叉查找树转变成排序的双向链表
- 二叉查找树转换为双向链表
- 解决AWAY3D的SegmentSet失效问题
- codeigniter框架目录结构及远行流程
- PB setsort()排序函数
- 手工实现servlet并部署
- [黑马程序员]关于C#中的重载、override和new区别
- 二叉查找树转为双向链表
- 跳跃表Skip List
- 策略模式c++实现
- C语言内存分区
- C# 里弹出“确定”“取消”对话框
- 全位运算实现的俄罗斯方块-J2SE版
- MSDN dynamic_cast static_cast const_cast reinterpret_cast
- Centzy:坑爹的店铺必滚蛋
- 实现目录拷贝 复制目录 复制文件