1. 程式人生 > >《程式設計師程式碼面試指南》二叉搜尋樹轉為雙向連結串列——java實現

《程式設計師程式碼面試指南》二叉搜尋樹轉為雙向連結串列——java實現

二叉搜尋樹轉為雙向連結串列

題目描述:

把一棵搜尋二叉樹,轉化成有序的雙向連結串列。

題目難度:

medium

題目思路:

思路一: 將二叉樹轉為雙向連結串列,其中指標對應關係為:二叉樹的左右指標分別對應雙向連結串列的前後指標。 採用遞迴的方式分別返回遍歷結果的左子樹和右子樹的頭節點。 知道左子樹的頭結點後,則找到頭結點的尾節點。 最後分別連上左子樹的尾節點,head,右子樹的頭結點。

程式碼實現:


/**
 * Created by Zhaoyang Ge on 2018/10/25.
 */
class Node{
    Node left;
    Node right;
    int value;
public Node(int value){ this.value = value; } } public class BSTToDoubleLinkedList { public static Node treeToDoubleLinkedList(Node head){ if (head == null){ return null; } return process(head); } private static Node process(Node head)
{ if (head == null){ return null; } Node leftNodeHead = process(head.left); Node rightNodeHead = process(head.right); Node leftNodeEnd = leftNodeHead; head.right = null; head.left = null; if (leftNodeHead != null){
while (leftNodeEnd.right != null){ //多了一層遍歷,需要根據頭結點找到尾節點 leftNodeEnd = leftNodeEnd.right; } } if (leftNodeEnd != null){ leftNodeEnd.right = head; head.left = leftNodeEnd; } if (rightNodeHead != null){ head.right = rightNodeHead; rightNodeHead.left = head; } return leftNodeHead == null ? head : leftNodeHead; } }

思路二: 直接用遞迴返回每個子樹的頭尾兩個節點。

程式碼實現:


/**
 * Created by Zhaoyang Ge on 2018/10/25.
 */
class Node {
    Node left;
    Node right;
    int value;

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

public class BSTToDoubleLinkedList {
    public static Node treeToDoubleLinkedList(Node head) {
        if (head == null) {
            return null;
        }
        return process(head)[0];
    }

    private static Node[] process(Node head) {
        if (head == null) {
            return new Node[]{null, null};
        }
        Node[] leftNodes = process(head.left);
        Node[] rightNodes = process(head.right);
        head.right = null;
        head.left = null;
        if (leftNodes[1] != null) {
            leftNodes[1].right = head;
            head.left = leftNodes[1];
        }
        if (rightNodes[0] != null) {
            head.right = rightNodes[0];
            rightNodes[0].left = head;
        }
        Node left = leftNodes[0] != null ? leftNodes[0] : head;
        Node right = rightNodes[1] != null ? rightNodes[1] : head;
        return new Node[]{left, right};
    }

    public static void printDoubleLinkedList(Node head) {
        System.out.print("Double Linked List: ");
        Node end = null;
        while (head != null) {
            System.out.print(head.value + " ");
            end = head;
            head = head.right;
        }
        System.out.print("| ");
        while (end != null) {
            System.out.print(end.value + " ");
            end = end.left;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Node head = new Node(5);
        head.left = new Node(2);
        head.right = new Node(9);
        head.left.left = new Node(1);
        head.left.right = new Node(3);
        head.left.right.right = new Node(4);
        head.right.left = new Node(7);
        head.right.right = new Node(10);
        head.left.left = new Node(1);
        head.right.left.left = new Node(6);
        head.right.left.right = new Node(8);

        head = treeToDoubleLinkedList(head);
        printDoubleLinkedList(head);

    }
}