《程式設計師程式碼面試指南》二叉搜尋樹轉為雙向連結串列——java實現
阿新 • • 發佈:2018-12-17
二叉搜尋樹轉為雙向連結串列
題目描述:
把一棵搜尋二叉樹,轉化成有序的雙向連結串列。
題目難度:
題目思路:
思路一: 將二叉樹轉為雙向連結串列,其中指標對應關係為:二叉樹的左右指標分別對應雙向連結串列的前後指標。 採用遞迴的方式分別返回遍歷結果的左子樹和右子樹的頭節點。 知道左子樹的頭結點後,則找到頭結點的尾節點。 最後分別連上左子樹的尾節點,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);
}
}