题目一描述:
有序数组转换成一颗二叉树
题目链接
题目一分析:
数组排好序中间位置为头结点,左边位置为左子树,右边节点为右子树,采用递归的方式进行树的构建
代码如下:
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return arrayToTree(nums,0,nums.length-1);
}
//输入一个有序的数组,以及需要构建树的范围,节点的第一个位置和最后指向的位置
public TreeNode arrayToTree(int[] nums,int i,int j){
//数组越界或者大指针小于小指针,直接返回空值
if(i<0||j<0||j<i||nums==null)return null;
//只有一个节点
if(j==i)return new TreeNode(nums[i]);
//计算中间位置,i是第一个位置的指向(i+j+1)/2
int mid = i+(j-i+1)/2;
TreeNode root = new TreeNode(nums[mid]);
//构建左树与右树
root.left = arrayToTree(nums,i,mid-1);
root.right = arrayToTree(nums,mid+1,j);
return root;
}
}
题目二描述:
有序链表转换成一颗二叉树
题目链接
题目二分析:
与上面的数组构建相类似,知识对于链表需要每次记住头结点的位置以及将单一链表分为两个链表来处理。
代码如下:
class Solution {
public TreeNode sortedListToBST(ListNode head) {
return listToTree(head);
}
public TreeNode listToTree(ListNode head){
//构建一棵树,如果是单节点或者空节点,直接返回,也是递归的出口
if(head==null)return null;
if(head.next == null)return new TreeNode(head.val);
//三个节点指针,前节点用来记录左子树的最后一个节点
//中间节点,用来记录树的头结点
//开节点,用来找中间位置
ListNode preNode = head;
ListNode midNode = head;
ListNode fastNode = head;
//找中间位置以及左树的最后一个节点
while(fastNode!=null&&fastNode.next!=null){
if(preNode!=midNode) preNode = preNode.next;
midNode = midNode.next;
fastNode = fastNode.next.next;
}
//将链表从该位置分开,前面的节点用来构建左子树
preNode.next = null;
TreeNode root = new TreeNode(midNode.val);
root.left = listToTree(head);
root.right = listToTree(midNode.next);
return root;
}
}