輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
思路:手動寫一顆二叉搜索樹,發現中序遍歷的結果是有序的,那麼將中序遍歷的結果保存起來,然後遍歷結果集合, 更改樹節點的指向即可。
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);
}
}