更多LeetCode算法与参考:
https://github.com/kkman2008/Notebook/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3.md
————————-
【题目】
对二叉树的节点来书,有本身的值域,有指向左孩子和右孩子的指针;对双链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针。在结构上,两种结构有
相似性,现在有一棵搜索二叉树,请将其转换为一个有序的双向链表。
【解答思路1】
使用辅助队列,先遍历二叉搜索树,将节点存入一个队列,再依次出队中元素,将先后出队的节点前后链接起来。时间复杂度为O(N),空间复杂度为O(N)
【解答思路2】
使用递归,直接在二叉搜索树上修改指针,不需要使用辅助队列,时间复杂度是O(n),空间复杂度是树的高度;
public class TreeNode {
public int val;
public TreeNode left = null;
public TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
// 二叉搜索树转换成双向链表--用递归
public static TreeNode biSearchTreeToBidirectionlinkList(TreeNode head){
if(head == null)
return null;
TreeNode tail = bstTolist(head);
head = tail.right;
tail.right = null;
return head;
}
// 二叉搜索树转换成双向链表的递归函数
public static TreeNode bstTolist(TreeNode head){
if(head == null)
return null;
TreeNode leftE = bstTolist(head.left);
TreeNode rightE = bstTolist(head.right);
TreeNode leftS = leftE.right;
TreeNode rightS = rightE.right;
if(leftE!=null && rightE!=null){
leftE.right = head;
head.left = leftE;
rightS.left = head;
head.right = rightS;
rightE.right = leftS;
return rightE;
}
else if(leftE != null){
leftE.right = head;
head.left = leftE;
head.right = leftS;
return head;
}
else if(rightE != null){
rightS.left = head;
head.right = rightS;
rightE.right = leftS;
return rightE;
}
else{
head.right = head;
return head;
}
}
【题目】 | |
对二叉树的节点来书,有本身的值域,有指向左孩子和右孩子的指针;对双链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针。在结构上,两种结构有 | |
相似性,现在有一棵搜索二叉树,请将其转换为一个有序的双向链表。 | |
【解答思路1】 | |
使用辅助队列,先遍历二叉搜索树,将节点存入一个队列,再依次出队中元素,将先后出队的节点前后链接起来。时间复杂度为O(N),空间复杂度为O(N) | |
【解答思路2】 | |
使用递归,直接在二叉搜索树上修改指针,不需要使用辅助队列,时间复杂度是O(n),空间复杂度是树的高度; |
版权声明:本文为kingmax54212008原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。