输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:手动写一颗二叉搜索树,发现中序遍历的结果是有序的,那么将中序遍历的结果保存起来,然后遍历结果集合, 更改树节点的指向即可。
import java.util.LinkedList;
public class Convert {
public static void main(String[] args) {
TreeNode root = new TreeNode(10);
TreeNode treeNode2 = new TreeNode(5);
TreeNode treeNode3 = new TreeNode(7);
TreeNode treeNode4 = new TreeNode(12);
root.left = treeNode2;
root.right = treeNode4;
treeNode2.right = treeNode3;
Convert convert = new Convert();
LinkedList<TreeNode> linkedList = new LinkedList<>();
TreeNode head = convert.Convert(root);
while(head != null) {
System.out.println(head.val);
head = head.right;
}
}
public TreeNode Convert(TreeNode pRootOfTree) {
LinkedList<TreeNode> linkedList = new LinkedList<>();
midLook(linkedList, pRootOfTree);
TreeNode pre = null;
TreeNode cur = null;
TreeNode head = linkedList.peek();
while (!linkedList.isEmpty()) {
cur = linkedList.pop();
cur.left = pre;
cur.right = linkedList.isEmpty() ? null : linkedList.peek();
pre = cur;
}
return head;
}
public void midLook(LinkedList<TreeNode> linkedList, TreeNode root) {
if (root == null) {
return;
}
midLook(linkedList, root.left);
linkedList.add(root);
midLook(linkedList, root.right);
}
}