题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
分析:可以用中序遍历树中的每一个结点,当遍历根节点时,把树看成三部分:根结点,根结点的左子树,根结点的右子树。
先将根结点转换为双向链表,再将左子树和右子树转换为双向链表。
java代码:
package Tree;
public class ConverToLinklist {
private Node root;
private class Node {
private Node left;
private Node right;
private int data;
public Node(int data) {
this.left = null;
this.right = null;
this.data = data;
}
}
public ConverToLinklist() {
root = null;
}
public void buildTree(Node node, int data) {
if (root == null) {
root = new Node(data);
} else {
if (data < node.data) {
if (node.left == null) {
node.left = new Node(data);
} else {
buildTree(node.left, data);
}
} else {
if (node.right == null) {
node.right = new Node(data);
} else {
buildTree(node.right, data);
}
}
}
}
/**
* 将二叉树转换为双向链表
*/
private Node last = null;;
public void ConvertNode(Node node) {
if (node == null)
return;
if (node.left != null)
ConvertNode(node.left);
node.left = last;
if (last != null)
last.right = node;
last = node;
if (node.right != null)
ConvertNode(node.right);
}
public void print(Node node) {
Node r = node;
while (r != null) {
System.out.print(r.data + " ");
r = r.right;
}
}
public static void main(String[] args) {
int[] a = { 2, 4, 12, 45, 21, 6, 111 };
ConverToLinklist bTree = new ConverToLinklist();
for (int i = 0; i < a.length; i++) {
bTree.buildTree(bTree.root, a[i]);
}
bTree.ConvertNode(bTree.root);
bTree.print(bTree.root);
}
}