[算法学习]二叉搜索树转双向链表
2016-02-18 13:49
218 查看
问题描述: 将一棵二叉搜索树转成一条排序好的双向链表。要求不能创建新结点。
解法与分析:
1. 由于左子树<根结点<右子树,所以双向链表的头结点是二叉搜索树左子树中的最后一个左结点,双向链表的头结点是二叉搜索树右子树中的最后一个右结点,根结点则是链表的中间结点。
2. 将树结点中指向左孩子的指针作为双向链表中的前驱指针,指向右孩子的指针作为双向链表指向后继结点的指针。
3. 按照上面分析,可以使用树的中序遍历来转换双向链表。这里我们使用递归的方式来实现中序遍历+双向链表转换。
附:源码地址
解法与分析:
1. 由于左子树<根结点<右子树,所以双向链表的头结点是二叉搜索树左子树中的最后一个左结点,双向链表的头结点是二叉搜索树右子树中的最后一个右结点,根结点则是链表的中间结点。
2. 将树结点中指向左孩子的指针作为双向链表中的前驱指针,指向右孩子的指针作为双向链表指向后继结点的指针。
3. 按照上面分析,可以使用树的中序遍历来转换双向链表。这里我们使用递归的方式来实现中序遍历+双向链表转换。
参考代码如下
[code]/** * 树节点 */ static class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; } public TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } } /** * 解法:中序遍历的顺序,中间增加连接节点的操作。 * @param root * @return */ public static TreeNode doBST2BWL(TreeNode root) { if(root==null) { return null; } TreeNode head=root; // 整理左半边 TreeNode left = doBST2BWL(root.left); // 连接左半边 if(left!=null) { head=left; // 将left指针移动到左半边的最后(右)一个结点 for(;left.right!=null;left=left.right); left.right=root; } root.left=left; // 整理右半边 TreeNode right= doBST2BWL(root.right); // 连接右半边 if(right!=null) { right.left=root; } root.right=right; // 返回头结点 return head; }
附:源码地址
相关文章推荐
- 正则表达式30分钟入门教程(第二版)
- Linux modprobe命令
- 【VS插件】Highlight all occurrences of selected word
- Android核心基础(手机卫士的一个知识点总结)
- Android常用UI控件 ViewGroup
- tcp 三次握手,四次挥手
- shell 基本计算、逻辑运算、位运算详解
- Android集成支付宝移动支付功能
- [算法学习]打印树的路径
- View的滚动原理简单解析
- 【R基础】包(未完)
- select与epoll、apache与nginx实现原理对比
- Android Studio调试功能使用总结【转】
- ReactNative 真机调试
- [算法学习]树的子结构
- 6、服务端配置汇总
- 一些C#实用的方法汇总
- Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd'问题解决方法
- 关联supportv4源码
- POJ 1418 Viva Confetti