题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
中序遍历,遍历的过程生成双向链表。
先实现双线链表,然后实现二叉查找树。
class Node {
private int value;
private Node pre = null;
private Node next = null;
private Node prior = null;
public Node(int value) {
this.value = value;
prior = this;
}
public void insert(int value) {
Node node = new Node(value);
prior.next = node;
node.pre = prior;
prior = node;
}
public void print() {
Node node = this;
Node n = null;
while (node != null) {
n = node;
System.out.print(node.value + " ");
node = node.next;
}
System.out.println("-----");
while (n != null) {
System.out.print(n.value + " ");
n = n.pre;
}
}
}
public class BiSearchTree {
private BiSearchTree LeftTree = null;
private BiSearchTree RightTree = null;
private int data;
public BiSearchTree(int data) {
this.data = data;
}
public void insert(int element) {
BiSearchTree tree = this;
BiSearchTree insert_node = new BiSearchTree(element);
BiSearchTree pre = null;
boolean left = true;
while (tree != null) {
pre = tree;
if (tree.data > element) {
left = true;
tree = tree.LeftTree;
} else {
left = false;
tree = tree.RightTree;
}
}
if (left) {
pre.LeftTree = insert_node;
} else {
pre.RightTree = insert_node;
}
}
public void exchange2Link() {
BiSearchTree node = this;
BiSearchTree parent = null;
Stack stack = new Stack();
Node twoDirLinkList = new Node(Integer.MAX_VALUE);
do {
while (node != null) {
stack.push(node);
node = node.LeftTree;
}
BiSearchTree opNode = (BiSearchTree) stack.pop();
twoDirLinkList.insert(opNode.data);
System.out.print(opNode.data + " ");
node = opNode.RightTree;
} while (!stack.IsEmpty() || node != null);
twoDirLinkList.print();
}
public static void main(String[] args) {
// int[] data = {5,2,3,7,4,1,8,6};
// int[] data = {10,5,12,4,7,2,14,12,9};
int[] data = { 10, 5, 12, 4, 7 };
BiSearchTree tree = new BiSearchTree(data[0]);
for (int i = 1; i < data.length; i++) {
tree.insert(data[i]);
}
}
}