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

【题目】

  对二叉树的节点来书,有本身的值域,有指向左孩子和右孩子的指针;对双链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针。在结构上,两种结构有

  相似性,现在有一棵搜索二叉树,请将其转换为一个有序的双向链表。

【解答思路1】

  使用辅助队列,先遍历二叉搜索树,将节点存入一个队列,再依次出队中元素,将先后出队的节点前后链接起来。时间复杂度为O(N),空间复杂度为O(N)

【解答思路2】

  使用递归,直接在二叉搜索树上修改指针,不需要使用辅助队列,时间复杂度是O(n),空间复杂度是树的高度;

 1 public class TreeNode {
 2     public int val;
 3     public TreeNode left = null;
 4     public TreeNode right = null;
 5 
 6     public TreeNode(int val) {
 7         this.val = val;
 8     }
 9   }
10   
11   // 二叉搜索树转换成双向链表--用递归
12     public static TreeNode biSearchTreeToBidirectionlinkList(TreeNode head){
13         if(head == null)
14             return null;
15         TreeNode tail = bstTolist(head);
16         head = tail.right;
17         tail.right = null;
18         return head;
19     }
20 
21     // 二叉搜索树转换成双向链表的递归函数
22     public static TreeNode bstTolist(TreeNode head){
23         if(head == null)
24             return null;
25 
26         TreeNode leftE = bstTolist(head.left);
27         TreeNode rightE = bstTolist(head.right);
28         TreeNode leftS = leftE.right;
29         TreeNode rightS = rightE.right;
30 
31         if(leftE!=null && rightE!=null){
32             leftE.right = head;
33             head.left = leftE;
34             rightS.left = head;
35             head.right = rightS;
36             rightE.right = leftS;
37             return rightE;
38         }
39         else if(leftE != null){
40             leftE.right = head;
41             head.left = leftE;
42             head.right = leftS;
43             return head;
44         }
45         else if(rightE != null){
46             rightS.left = head;
47             head.right = rightS;
48             rightE.right = leftS;
49             return rightE;
50         }
51         else{
52             head.right = head;
53             return head;
54         }
55     }
View Code

 

【题目】
  对二叉树的节点来书,有本身的值域,有指向左孩子和右孩子的指针;对双链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针。在结构上,两种结构有
  相似性,现在有一棵搜索二叉树,请将其转换为一个有序的双向链表。
  【解答思路1】
  使用辅助队列,先遍历二叉搜索树,将节点存入一个队列,再依次出队中元素,将先后出队的节点前后链接起来。时间复杂度为O(N),空间复杂度为O(N)
  【解答思路2】
  使用递归,直接在二叉搜索树上修改指针,不需要使用辅助队列,时间复杂度是O(n),空间复杂度是树的高度;
posted @ 2017-11-06 14:33  Apollo_zhanghongbo  阅读(663)  评论(0编辑  收藏  举报