Problem:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
Intuition:
这个题目实际上只是要我们在原来的树上添加一些边。举个简单的例子,二叉搜索树叶子节点本来左右子树都是null,经过算法处理后现在左应该指向小于它的最大元素,右子树现在应该指向大于它的最小元素。
解题思路:
1.将左子树构造成双链表,并返回链表头节点。
2.定位至左子树双链表最后一个节点。
3.如果左子树链表不为空的话,将当前root追加到左子树链表。
4.将右子树构造成双链表,并返回链表头节点。
5.如果右子树链表不为空的话,将该链表追加到root节点之后。
6.根据左子树链表是否为空确定返回的节点。
Solution:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| public class CodingInterview_036 { class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode(int val){ this.val=val; } }
public TreeNode Convert(TreeNode root) { if(root==null) return null; if(root.left==null&&root.right==null) return root; TreeNode left = Convert(root.left); TreeNode p = left; while(p!=null&&p.right!=null){ p = p.right; } if(left!=null){ p.right = root; root.left = p; } TreeNode right = Convert(root.right); if(right!=null){ right.left = root; root.right = right; } return left!=null?left:root; } }
|