zoukankan      html  css  js  c++  java
  • 栈和队列----将搜索二叉树转换成双向链表

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

      

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

      

  • 相关阅读:
    winform笔记
    深度GHOST安装,GHOST完毕后不能启动继续
    CSS+JS;JS+CSS换肤总结
    windows2008配置来
    ul li做标题列表中间出现多的一个空行,重复。
    洛谷P3376 【模板】网络最大流
    洛谷P3387 【模板】缩点
    洛谷P3796 【模板】AC自动机(加强版)
    洛谷P3384 【模板】树链剖分
    洛谷P3919 【模板】可持久化数组(可持久化线段树/平衡树)
  • 原文地址:https://www.cnblogs.com/Demrystv/p/9352959.html
Copyright © 2011-2022 走看看