输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
转换成双向链表
1=2=3=4=5=6=7=8=9=10=11=12=13=14=15。
代码如下
public class BinaryTree2LinkedTree {
private static TreeNode head,tail;
static class TreeNode{
private int v;
private TreeNode left;
private TreeNode right;
public TreeNode(int v, TreeNode left, TreeNode right) {
this.v = v;
this.left = left;
this.right = right;
}
public int getV() {
return v;
}
public void setV(int v) {
this.v = v;
}
public TreeNode getLeft() {
return left;
}
public void setLeft(TreeNode left) {
this.left = left;
}
public TreeNode getRight() {
return right;
}
public void setRight(TreeNode right) {
this.right = right;
}
}
public static void traversal(TreeNode node){
if(node ==null) return;
if(node.getLeft()!=null) traversal(node.getLeft());
changeNode(node);
if(node.getRight() != null) traversal(node.getRight());
}
private static void changeNode(TreeNode node) {
//初始时,双向链表中无节点,head及tail均为null
if (head == null) {
head = node;
tail = node;
} else {
//将新node的左指针指向当前tail,再将当前tail的右指针指向新node,最后将tail后移
node.setLeft(tail);
tail.setRight(node);
tail = node;
}
}
public static void main(String[] args) {
TreeNode node1 = new TreeNode(1,null,null);
TreeNode node3 = new TreeNode(3,null,null);
TreeNode node2 = new TreeNode(2,node1,node3);
TreeNode node5 = new TreeNode(5,null,null);
TreeNode node7 = new TreeNode(7,null,null);
TreeNode node6 = new TreeNode(6,node5,node7);
TreeNode node4 = new TreeNode(4,node2,node6);
TreeNode node9 = new TreeNode(9,null,null);
TreeNode node11 = new TreeNode(11,null,null);
TreeNode node10 = new TreeNode(10,node9,node11);
TreeNode node13 = new TreeNode(13,null,null);
TreeNode node15 = new TreeNode(15,null,null);
TreeNode node14 = new TreeNode(14,node13,node15);
TreeNode node12 = new TreeNode(12,node10,node14);
TreeNode node8 = new TreeNode(8,node4,node12);
traversal(node8);
while (head != null) {
System.out.print(head.getV() + " ");
head = head.getRight();
}
}
}