剑指offer:二叉搜索树与双向链表(java)
2016-10-03 22:12
204 查看
题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建新的结点,只能调整树中结点指针的指向。
比如如下图中的二叉搜索树,则输出转换之后的排序双向链表为:
由于要求转换之后的链表是排好序的,我们可以中序遍历树的每一个结点,这是因为中序遍历算法的特点是按照从小到大的顺序遍历二叉树的每一个结点。当遍历到根结点的时候,我们把树看成三部分:值为10的结点、根结点为6的左子树、根结点为14的右子树。根据排序链表的定义,值为10的结点将和它左子树最大一个结点链接起来,同时它还将和右子树的最小的结点链接起来。按照中序遍历的顺序,当我们遍历转换到根结点时,它的左子树已经转换成一个排序的链表了,并且处在链表中的最后一个结点是当前值最大的结点。接着我们去遍历转换右子树,并把根结点和右子树中最小的结点链接起来。左、右子树的转换方法相同,很自然地想到可以用递归去做。
比如如下图中的二叉搜索树,则输出转换之后的排序双向链表为:
由于要求转换之后的链表是排好序的,我们可以中序遍历树的每一个结点,这是因为中序遍历算法的特点是按照从小到大的顺序遍历二叉树的每一个结点。当遍历到根结点的时候,我们把树看成三部分:值为10的结点、根结点为6的左子树、根结点为14的右子树。根据排序链表的定义,值为10的结点将和它左子树最大一个结点链接起来,同时它还将和右子树的最小的结点链接起来。按照中序遍历的顺序,当我们遍历转换到根结点时,它的左子树已经转换成一个排序的链表了,并且处在链表中的最后一个结点是当前值最大的结点。接着我们去遍历转换右子树,并把根结点和右子树中最小的结点链接起来。左、右子树的转换方法相同,很自然地想到可以用递归去做。
public BinaryTreeNode convert(BinaryTreeNode root){ BinaryTreeNode node = null; convert(root,node); while(node != null && node.leftNode != null){ node = node.leftNode; } return node; } public void convert(BinaryTreeNode root,BinaryTreeNode lastNode){ if(root == null) return; BinaryTreeNode current = root; if(current.leftNode != null) convert(current.leftNode,lastNode); current.leftNode = lastNode; if(lastNode != null) lastNode.rightNode = current; if(current.rightNode != null) convert(current.rightNode,lastNode); }
相关文章推荐
- 剑指Offer面试题27(Java版):二叉搜索树与双向链表
- 【剑指offer-Java版】27二叉搜索树与双向链表
- 【剑指offer 面试题27】二叉搜索树与双向链表
- [剑指offer] 二叉搜索树与双向链表
- 剑指Offer——(26)二叉搜索树与双向链表
- 剑指offer 面试题27 二叉搜索树与双向链表
- 剑指Offer面试题24(Java版):二叉搜索树的后序遍历序列
- 剑指offer(六十)之二叉搜索树与双向链表
- 剑指Offer 24题 二叉搜索树的后序遍历序列 Java
- 剑指offer----二叉搜索树的第K个节点----java实现
- 剑指offer 27. 二叉搜索树与双向链表
- 剑指offer刷题之java实现的二叉搜索树的后序遍历序列
- 剑指offer之面试题27二叉搜索树与双向链表
- 剑指offer:二叉搜索树与双向链表
- 剑指offer(15)-二叉搜索树与双向链表
- 剑指offer 27 - 二叉搜索树与双向链表
- 剑指offer面试题27-二叉搜索树转双向链表
- 【剑指offer】之二叉搜索树转双向链表
- 剑指Offer面试题26复杂链表的复制,面试题27二叉搜索树和双向链表(递归)
- 【剑指offer】二叉搜索树转有序双向链表