将搜索二叉树转换成双向链表


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);



     }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值