这个题的意思就是将一个二叉搜索树转换成一个双向链表,比如
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 }