题目描述:使用单链表构建平衡搜索树
给定一个单链表,其中的元素按升序排序,请将它转化成平衡二叉搜索树(BST)。
题目分析:
平衡搜索树是每个节点的左结点小于该节点,每个节点的右节点大于该节点,并且左树与右树的高度差不超过1。由于链表已经是有序的,因此构建平衡二叉搜索树时,将链表中最中间的节点设置为该树的树根,将链表分为两个子链表用来构建树的左孩子和右孩子。
代码如下:
public class Solution {
public TreeNode sortedListToBST(ListNode head) {
if(head==null){
return null;
}
//递归结束的条件,链表中只有一个元素
if(head.next==null){
return new TreeNode(head.val);
}
//对于链表,双指针概念很重要,双指针能够找到中间位置的节点
ListNode fastnode=head.next;
ListNode slownode=head;
//循环找到中间位置的节点
while(fastnode.next!=null&&fastnode.next.next!=null){
fastnode=fastnode.next.next;
slownode=slownode.next;
}
//将链表中间的节点加入到树中
TreeNode tree=new TreeNode(slownode.next.val);
//该树的右孩子是中间节点的右边所组成的新链表
tree.right=sortedListToBST(slownode.next.next);
//左树为中间节点的左边链表,因此将中间节点的下一个节点指向空位置
slownode.next=null;
tree.left=sortedListToBST(head);
return tree;
}
}
题目描述:
给出一个升序排序的数组,将其转化为平衡二叉搜索树(BST)。
题目分析:
与上边的链表相同,是一个递归创建树的过程,中间位置的元素为树的根节点,左边的子数组为树的左子树,右边的子节点为右子树。在java中Arrays.copyOfRange(source,start,end)表示将source数组复制其start到end的元素为新数组。
代码如下:
public class Solution {
public TreeNode sortedArrayToBST(int[] num) {
if(num.length<=0){
return null;
}
//递归结束条件,如果数组中只剩一个元素,则将该元素创建一个树的节点返回
if(num.length==1){
return new TreeNode(num[0]);
}
//中间位置的数为树的根节点
TreeNode tree=new TreeNode(num[num.length/2]);
//将数组分成另个子数组构建树的左树与书的右树
tree.left=sortedArrayToBST(Arrays.copyOfRange(num, 0, num.length/2));
tree.right=sortedArrayToBST(Arrays.copyOfRange(num, num.length/2+1,num.length));
return tree;
}
}