题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
返回双向链表最左侧的节点。
解题思路:
这道题的重点就是在如何左子树的最右下节点,右子树的最左下节点与根结点进行相连。
利用中序遍历来实现。
Java源码实现:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.Stack;
public class Solution {
/*public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) return null;
if (pRootOfTree.left == null && pRootOfTree.right == null) return pRootOfTree;
Stack<TreeNode> stack = new Stack<>();
TreeNode p = pRootOfTree;
TreeNode pre = null;
boolean isFirst = true; // 为true是代表当前节点是最左节点,也是双向链表的头节点
while(p != null || !stack.isEmpty()) {
while(p != null) {
stack.push(p);
p = p.left;
}
if (!stack.isEmpty()) {
p = stack.pop();
if (isFirst) {
pRootOfTree = p;
pre = pRootOfTree;
isFirst = false;
} else {
pre.right = p;
p.left = pre;
pre = p;
}
p = p.right;
}
}
return pRootOfTree;
} */
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) return null;
if (pRootOfTree.left == null && pRootOfTree.right == null) return pRootOfTree;
TreeNode left = Convert(pRootOfTree.left);
TreeNode right = Convert(pRootOfTree.right);
TreeNode p = left;
// 找到左子树的最右边的节点
while(p!=null&&p.right!=null){
p = p.right;
}
// 根节点指向新的左子节点
if(left!=null){
p.right = pRootOfTree;
pRootOfTree.left = p;
}
// 根节点指向新的右子节点
if(right!=null){
right.left = pRootOfTree;
pRootOfTree.right = right;
}
return left!=null?left:pRootOfTree; // 左子树为空时,中序遍历第一个节点就是根节点
}
}