将搜索二叉树转换成有序的双向链表
2016-07-21 19:24
253 查看
根据搜索二叉树的性质:中序遍历是有序的,因此中序遍历搜索二叉树,将left相当于prev指向前一个小的数,right相当于next指向后一个较大的数。
递归实现
非递归
递归实现
Node* TurnToList_R() //搜索树转换为有序的双向链表 { cout << "递归" << endl; Node *Head = NULL; //头指针 Node *Tail = NULL; //尾指针 _TurnToList(_root, Tail); //找头结点 Head = _root; while (Head->_left) { Head = Head->_left; } return Head; } void _TurnToList(Node *&root, Node *&Tail) { if (root == NULL) return; Node *cur = root; if (cur->_left) _TurnToList(cur->_left, Tail); cur->_left = Tail; //使下一个节点和链表尾连接上 if (Tail != NULL) Tail->_right = cur; Tail = cur; //更新尾指针 if (cur->_right) _TurnToList(cur->_right, Tail); }
非递归
Node* TurnToList() { cout << "非递归" << endl; stack<Node*> s; Node *cur = _root; //遍历搜索树 Node *node = NULL; //当前节点 Node *tail = NULL; Node *head = NULL; while (cur || !s.empty()) { while (cur) { s.push(cur); cur = cur->_left; } if (!s.empty()) { node = s.top(); s.pop(); if (head == NULL) //设置头结点 { head = node; } node->_left = tail; if (tail) tail->_right = node; tail = node; cur = node->_right; } } tail->_right = NULL; return head;
相关文章推荐
- C#递归算法之分而治之策略
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- C#递归方法实现无限级分类显示效果实例
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#递归算法之打靶算法分析
- C#中的尾递归与Continuation详解
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- PHP递归创建多级目录
- Javascript递归打印Document层次关系实例分析
- C#递归算法寻找数组中第K大的数
- C++使用递归方法求n阶勒让德多项式完整实例
- C#用递归算法解决经典背包问题
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- C# 递归查找树状目录实现方法