import java.util.*;
//将搜索二叉树转换成双向链表
public class TwoList{
//节点的定义
public static class Node{
public int value;
public Node left;
public Node right;
public Node(int data)
{
this.value=data;
}
}
//--------------------------------------------------------------------
//(方法一:利用队列(栈)存储查询的结果)将搜索二叉树转换成双向链表
public static Node twoList(Node head)
{
Queue<Node> queue=new LinkedList<Node>();
InOrderToQueue(head,queue);
//二叉树为空
if(queue.isEmpty())
{
return head;
}
head=queue.poll(); //弹出队列的第一个节点
Node pre=head;
pre.left=null;
Node cur=null;
//重新组合成双向链表
while(!queue.isEmpty())
{
cur=queue.poll();
pre.right=cur;
cur.left=pre;
pre=cur;
}
pre.right=null;
return head;
}
//递归将二叉树的中序遍历结果放入队列中
public static void InOrderToQueue(Node head,Queue<Node>queue)
{
if(head==null)
{
return;
}
InOrderToQueue(head.left,queue);
queue.offer(head);
InOrderToQueue(head.right,queue);
}
//--------------------------------------------------------------------
//(方法二:利用递归函数)将搜索二叉树转换成双向链表
public static Node twoList2(Node head)
{
if (head == null) {
return null;
}
Node last = process(head);
head = last.right; //指向第一个节点
last.right = null;//最后节点右指针指向null
return head;
}
//对二叉树的特殊操作
public static Node process(Node head) {
if (head == null) {
return null;
}
Node leftE = process(head.left); // left end
Node rightE = process(head.right); // right end
Node leftS = leftE != null ? leftE.right : null; // left start
Node rightS = rightE != null ? rightE.right : null; // right start
if (leftE != null && rightE != null) {
leftE.right = head;
head.left = leftE;
head.right = rightS;
rightS.left = head;
rightE.right = leftS;
return rightE;
} else if (leftE != null) {
leftE.right = head;
head.left = leftE;
head.right = leftS;
return head;
} else if (rightE != null) {
head.right = rightS;
rightS.left = head;
rightE.right = head;
return rightE;
} else {
head.right = head;
return head;
}
}
//--------------------------------------------------------------------
//打印双向链表
public static void PrintList(Node head)
{
while (head!=null)
{
System.out.print(head.value+" ");
head=head.right;
}
System.out.println();
}
public static void main(String []args)
{
//建立二叉搜索树
Node node=new Node(6);
node.left=new Node(4);
node.right=new Node(7);
node.left.left=new Node(2);
node.left.right=new Node(5);
node.right.right=new Node(9);
node.left.left.left=new Node(1);
node.left.left.right=new Node(3);
node.right.right.left=new Node(8);
//Node mode=twoList(node);
Node mode=twoList2(node);
PrintList(mode);
}
}