栈和队列----将搜索二叉树转换成双向链表

将搜索二叉树转换成双向链表

  

  对于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);
    }

}

 

  

posted @ 2018-07-23 09:09  Demrystv  阅读(522)  评论(0编辑  收藏  举报