【中等】将搜索二叉树转换成双向链表-Java:解法一

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程大家好!欢迎来到我的网站! 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑,人工智能时代就要来临了,科… 继续阅读 前言icon-default.png?t=O83Ahttps://www.captainai.net/

package live.every.day.ProgrammingDesign.CodingInterviewGuide.List;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 将搜索二叉树转换成双向链表
 *
 * 【题目】
 * 对于二叉树的节点来说,有本身的数据域,有指向左孩子和右孩子的两个指针;对双向链表的节点来说,有本身的数据域,有指向上一
 * 个节点和下一个节点的指针。在结构上,两种结构有相似性,现在有一棵搜索二叉树,请将其转换为一个有序的双向链表。
 * 对每一个节点来说,原来的二叉树右孩子指针等价于转换后的双向链表的next指针,原来的二叉树左孩子指针等价于转换后的pre指
 * 针,最后返回转换后的双向链表头节点。
 *
 * 【难度】
 * 中等
 *
 * 【解答】
 * 方法一:用队列等容器收集二叉树中序遍历结果的方法。时间复杂度为O(N),额外空间复杂度为O(N),具体过程如下:
 * 1、生成一个队列,记为queue,按照二叉树中序遍历的顺序,将每个节点放入queue中。
 * 2、从queue中依次弹出节点,并按照弹出的顺序重连所有的节点即可。
 * 方法一的具体实现请参看如下代码中的convert1方法。
 *
 * @author Created by LiveEveryDay
 */

public class ConvertBSTToDoubleList1 {

    public static class Node {
        public int data;
        public Node left;
        public Node right;

        public Node(int data) {
            this.data = data;
        }
    }

    public static Node convert1(Node head) {
        Queue<Node> queue = new LinkedList<>();
        inOrderToQueue(head, queue);
        if (queue.isEmpty()) {
            return head;
        }
        head = queue.poll();
        Node pre = head;
        pre.left = null;
        Node cur = null;
        while (!queue.isEmpty()) {
            cur = queue.poll();
            pre.right = cur;
            cur.left = pre;
            pre = cur;
        }
        pre.right = null;
        return head;
    }

    private static void inOrderToQueue(Node head, Queue<Node> queue) {
        if (head == null) {
            return;
        }
        inOrderToQueue(head.left, queue);
        queue.offer(head);
        inOrderToQueue(head.right, queue);
    }

    public static void main(String[] args) {
        Node node1 = new Node(2);
        Node node2 = new Node(3);
        Node node3 = new Node(5);
        Node node4 = new Node(7);
        Node node5 = new Node(8);
        Node node6 = new Node(1);
        Node node7 = new Node(3);
        node1.left = node2;
        node1.right = node3;
        node2.left = node4;
        node2.right = node5;
        node3.left = node6;
        node3.right = node7;
        Node n = convert1(node1);
        while (n != null) {
            System.out.printf("%d ", n.data);
            n = n.right;
        }
    }

}

// ------ Output ------
/*
7 3 8 2 1 5 3
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值