题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:二叉搜索树中序遍历就是有序序列,把整个树拆成3部分,根,左子树,右子树。连接起来应该是,左子树的最右叶子节点的右指针指向根,根的左指针指向左子树最右节点,根的右指针指向右子树的最左节点,右子树的最左节点的左指针指向根。然后递归遍历。最后判断左子树的最左节点是否为null,如果为null则返回根。
实现代码:
/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree == null) return null; if(pRootOfTree.left == null && pRootOfTree.right == null) return pRootOfTree; TreeNode leftNode = Convert(pRootOfTree.left); TreeNode curNode = leftNode; //找到左子树最右边的叶子节点 while(curNode != null && curNode.right != null) { curNode = curNode.right; } //连接根节点与左子树的最右叶子节点 if(leftNode != null) { pRootOfTree.left = curNode; curNode.right = pRootOfTree; } //右子树的最左叶子节点 TreeNode rightNode = Convert(pRootOfTree.right); //连接根节点与右子树的最左叶子节点 if(rightNode != null) { pRootOfTree.right = rightNode; rightNode.left = pRootOfTree; } //考虑没有左子树的情况 return leftNode==null?pRootOfTree:leftNode; }}