zoukankan      html  css  js  c++  java
  • 二叉搜索树转有序双向链表

    题目描述:

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

    解题方法:

    由于二叉搜索树的中序遍历,按照由小到大的顺序依次遍历树中的每个结点,所以可以利用中序遍历解决此题。

    使用指针last指向上一次遍历的结点,将last指向的结点与本次遍历的结点互连。

    新建一个结点head,last初始指向head;

    中序遍历的第一个结点是结点4,将last与结点4互连, 也即head与结点4互连,同时将last指向结点4;

    中序遍历的第二个结点是结点6,将last与结点6互连, 也即结点4与结点6互连,同时将last指向结点6;

    。。。

    最后断开head与结点4的链接,返回结点4.

     实现代码:

        // 新建一个结点,作为整个链表的起始点
        private static TreeNode head = new TreeNode(0);
        // 指向上个结点,初始指向head结点
        private static TreeNode last = head;
    
        // 利用中序遍历构建双向链表
        private static void convert(TreeNode node) {
            if (node == null) return;
    
            convert(node.left);
            // 将上个结点与该结点互连
            last.right = node;
            node.left = last;
            last = node;
    
            convert(node.right);
        }
    
        public static TreeNode BST2BiList(TreeNode root) {
            if (root == null) return null;
            convert(root);
            // 与head相连的结点为链表的起始点
            // 断开head与其相连结点的链接,并返回该结点
            last = head.right;
            last.left = null;
            head.right = null;
            return last;
        }
  • 相关阅读:
    分布式搜索引擎Elasticsearch的查询与过滤
    剖析Elasticsearch集群系列第一篇 Elasticsearch的存储模型和读写操作
    分布式缓存 cachecloud
    npm是什么NPM的全称是Node Package Manager
    Grafana监控可视化环境搭建
    github ssl验证跳过
    Linux分区扩容
    手把手教你把Vim改装成一个IDE编程环境(图文)
    根据条件批量删除document
    奇智网络聊天机器人
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9475863.html
Copyright © 2011-2022 走看看