【题目】
对二叉树的节点来书,有本身的值域,有指向左孩子和右孩子的指针;对双链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针。在结构上,两种结构有
相似性,现在有一棵搜索二叉树,请将其转换为一个有序的双向链表。
【解答思路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 }
【题目】 | |
对二叉树的节点来书,有本身的值域,有指向左孩子和右孩子的指针;对双链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针。在结构上,两种结构有 | |
相似性,现在有一棵搜索二叉树,请将其转换为一个有序的双向链表。 | |
【解答思路1】 | |
使用辅助队列,先遍历二叉搜索树,将节点存入一个队列,再依次出队中元素,将先后出队的节点前后链接起来。时间复杂度为O(N),空间复杂度为O(N) | |
【解答思路2】 | |
使用递归,直接在二叉搜索树上修改指针,不需要使用辅助队列,时间复杂度是O(n),空间复杂度是树的高度; |