二叉树双转化向链表

问题描述:

        双向链表节点结构和二叉树节点结构是一样的,如果你把last认为是left,next认为是next的话。给定一个搜索二叉树的头节点head,请转化为一条有序的双向链表,并返回链表的头节点。

思路:

        根据题意我们可以举例搜索二叉树转换为双向链表的例子。

         转化为双向链表的顺序为:2 3 4 5 6 7 8.

        我们可以发现转化后的结果和搜索二叉树的中序遍历节点顺序相同。

思路一:对搜索二叉树进行中序遍历,把遍历结果转化为双向链表的形式。

思路二:我们定义一个方法process(Node) ,这个方法返回以Node为根的搜索二叉树转化成的双向链表,返回这个双向链表的头节点和尾结点。在搜索二叉树根节点取到左子树的双向链表同时也取到右子树的双向链表,把这两个双向链表以及根节点结合成一个完整的双向链表。

代码

思路一代码

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

        public Node(int data) {
            this.value = 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;
    }

    public 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 Node convert2(Node head) {
        if (head == null) {
            return null;
        }
        return process(head).start;
    }

    public static class Info {
        public Node start;
        public Node end;

        public Info(Node start, Node end) {
            this.start = start;
            this.end = end;
        }
    }

    public static Info process(Node X) {
        if (X == null) {
            return new Info(null, null);
        }
        Info leftInfo = process(X.left);
        Info rightInfo = process(X.right);
        if (leftInfo.end != null) {
            leftInfo.end.right = X;
        }
        X.left = leftInfo.end;
        X.right = rightInfo.start;
        if (rightInfo.start != null) {
            rightInfo.start.left = X;
        }
        return new Info(
                leftInfo.start != null ? leftInfo.start : X,
                rightInfo.end != null ? rightInfo.end : X
        );
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值