二叉排序树转化成双链表
2015-10-04 15:13
267 查看
1、二叉排序树定义:
二叉排序树是一棵空树,或者具有以下性质
(1)若左子树不空,那么左子树的所有节点均小于根节点。
(2)若右子树不空,那么右子树中所有节点均大于根节点。
(3)左右子树又是一颗二叉排序树。
2、二叉排序树变成双链表
将图中的二叉排序树变成双链表的思路:二叉树操作最常用的是递归算法。如果在左右子树已经是双链表的基础上,将左子树链表、右子树链表以及根节点变成一个双链表我们可以这样做:首先找到左子树链表最右边的元素(最大),右子树链表最左边的元素(最小),将这两个元素与根节点连接,那么就变成了一个双链表了。所以我们首先要做的是将左右子树变成双链表。
步骤:
(1)将左右子树变成双链表。
(2)左右子树链表与根节点进行合并,变成一个双链表。
C++代码实现
二叉排序树是一棵空树,或者具有以下性质
(1)若左子树不空,那么左子树的所有节点均小于根节点。
(2)若右子树不空,那么右子树中所有节点均大于根节点。
(3)左右子树又是一颗二叉排序树。
2、二叉排序树变成双链表
将图中的二叉排序树变成双链表的思路:二叉树操作最常用的是递归算法。如果在左右子树已经是双链表的基础上,将左子树链表、右子树链表以及根节点变成一个双链表我们可以这样做:首先找到左子树链表最右边的元素(最大),右子树链表最左边的元素(最小),将这两个元素与根节点连接,那么就变成了一个双链表了。所以我们首先要做的是将左右子树变成双链表。
步骤:
(1)将左右子树变成双链表。
(2)左右子树链表与根节点进行合并,变成一个双链表。
C++代码实现
struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x):val(x),left(nullptr),right(nullptr) { } }; void convert(TreeNode *root) { if(root == nullptr) return; if(root->left == nullptr && root->right == nullptr) return; TreeNode *left = root->left; TreeNode *right = root->right; //左右子树变成双链表 convert(left); convert(right); //将左右子树链表与根节点合并一起 if(left){ while(left->right) left = left->right; left->right = root; root->left = left; } if(right){ while(right->left) right = right->left; root->right = right; right->left = root; } } TreeNode* binaryTreeToDoubleList(TreeNode *root){ if(root == nullptr) return nullptr; convert(root); //将root指向头结点 while(root->left) root = root->left; return root; } int main(int argc, char const *argv[]) { shared_ptr<TreeNode> root(new TreeNode(7)); shared_ptr<TreeNode> left(new TreeNode(4)); shared_ptr<TreeNode> right(new TreeNode(10)); shared_ptr<TreeNode> node(new TreeNode(6)); root->left = left.get(); root->right = right.get(); left->right = node.get(); TreeNode *p = binaryTreeToDoubleList(root.get()); while(p != nullptr){ cout << p->val << "\t"; p = p->right; } return 0; }
相关文章推荐
- 二叉排序树转化成双链表
- UNRECOGNIZED SELECTOR SENT TO INSTANCE 问题快速定位的方法
- 集合视图UICollectionView
- 闪讯利用openwrt路由器拨号教程(五)
- php对象在内存中的分配
- storm-starter中的RollingTopWords代码解析
- 为什么要用Lua脚本呢?(一)
- storyBoard和用segue切换视图的方法
- xcode中如何重命名文件夹
- Python加载csv文件的两种方式
- excel排版大师测试记录:对两个约3000行、30列的excel文件分割为pdf文件
- iOS8互动的新通知
- Ubuntu vbox xp虚拟机共享文件夹
- [PAT]1096. Consecutive Factors (20)
- 常用网络判断
- 【剑指offer】面试题28:弦乐
- TinyHttpd代码解析
- How To Install Laravel 4 Framework on Ubuntu
- sicily 1036. Crypto Columns
- Android configuration使用 为什么监听事件onConfigurationChanged没有反应