将搜索二叉树转换成双向链表
对于BST 来说,有本身的值域,有指向左孩子和右孩子的两个指针;对于双向链表来说,有本身的值域,有指向上一个节点和下一个节点的指针。将这个BST转换成双向链表,对于每一个节点来说,原来的right指针等价于转换后的next指针,原来的left指针等价于转换后的left指针,最后返回双向链表的头节点。
【解析】
用队列等容器收集二叉树 中序遍历的结果的方法。其时间复杂度是O(N),空间复杂度是O(N)。
1. 生成一个队列,记为queue,按照二叉树的中序遍历的顺序,将每个节点放入queue中
2. 从queue中依次弹出节点,并按照弹出的顺序重连所有的节点即可
package com.test; import com.test.TreeNode; import java.util.LinkedList; import java.util.Queue; /** * Created by Demrystv. */ public class ConvertBSTTOListNodeDouble { /** * 用队列等容器收集二叉树 中序遍历的结果的方法。其时间复杂度是O(N),空间复杂度是O(N) */ public TreeNode convertBSTToListNodeDouble(TreeNode head){ Queue<TreeNode> queue = new LinkedList<TreeNode>(); inOrderToQueue(head, queue); if (queue.isEmpty()){ return head; } head = queue.poll(); TreeNode pre = head; pre.left = null; TreeNode cur = null; while (!queue.isEmpty()){ cur = queue.poll(); pre.right = cur; cur.left = pre; pre = cur; } pre.right = null; return head; } // 用递归的方式将中序遍历结果 放到 queue 中 private void inOrderToQueue(TreeNode head, Queue<TreeNode> queue){ if (head == null){ return; } inOrderToQueue(head.left, queue); queue.offer(head); inOrderToQueue(head.right, queue); } }