这个题的意思就是将一个二叉搜索树转换成一个双向链表,比如

      10  

    6       14

  4  8  12  16

  这样一个二叉搜索树,那么转换成双向链表之后的序列就是4,6,8,10,12,14,16。

  很明显,采用的应该是类似中序遍历的方式进行树的遍历,同时保存已经访问的节点的最大值,将该最大值与当前节点建立链接,然后将最大值赋予当前节点即可。

  如此循环往复,即可完成双向链表的建立。具体代码如下:

  

 1 package offer;
 2 
 3 class Node{
 4     public Node(int val){
 5         this.val = val;
 6     }
 7     int val;
 8     Node left;
 9     Node right;
10 }
11 public class DoubleList{
12 
13     public Node getList(Node Tree){
14         Node list = null;
15         list = listCreate(Tree,list);
16         while(list.left!=null){
17             list = list.left;
18         }
19         return list;
20 
21     }
22 
23     public Node listCreate(Node root,Node list){
24         if(root==null){
25             return null;
26         }
27         //对左子树进行操作
28         if(root.left!=null){
29             list = listCreate(root.left,list);
30         }
31         //对当前节点的操作,list指向的始终是当前已遍历的节点中的最大值
32         //当前已遍历的最大值的右指针指向当前节点,当前节点左指针指向该最大值,然后将最大值指向当前节点
33         root.left = list;
34         if(list!=null){
35             list.right = root;
36         }
37         list  = root;
38         //对右子树进行操作
39         if(root.right!=null){
40             list = listCreate(root.right,list);
41         }
42         return list;
43     }
44 
45     public static void main(String [] args){
46         Node root = new Node(10);
47         Node l1 = new Node(6);
48         Node l2 = new Node(4);
49         Node l3 = new Node(8);
50         Node l4 = new Node(14);
51         Node l5 = new Node(12);
52         Node l6 = new Node(16);
53         root.left = l1;
54         root.right = l4;
55         l1.left = l2;
56         l1.right = l3;
57         l4.left = l5;
58         l4.right = l6;
59 
60         DoubleList dl = new DoubleList();
61         root = dl.getList(root);
62         System.out.println(root.val);
63     }
64 }