leetcode 108 和leetcode 109

//感想:有时候啊,对于一道题目,如果知道那个点在哪,就会非常简单,比如说这两题,将有序的数组转换为二叉搜索树,

有几个点:

1.二叉搜索树:对于某个节点,它的左节点小于它,它的右节点大于它,这是二叉搜索树的性质,所以呢我们又可以得出一个结论:中序遍历这个树,我们就可以发现一定是有序的数组,从小到大,因为中序遍历就是先左节点--->根节点----->右节点,所以是有序的。

2.对于一个二叉搜索树我们可以很方便的转换成有序数组,但是反过来呢?怎么将一个有序数组转换成二叉搜索树呢?

问题的关键变成了如果找到我们转换后的根节点,根节点有了,那数组中根节点左边的元素就是左子树了,右边的就是右子树,然后再往下递归进入左边,右边递归得到它们的根节点即上一层的左节点,右节点,就是这样递归到底就好了,到底的终止条件就是查找的区间不存在元素了,返回null就好。

3.对于关键就是谁是根节点呢?

我也不知道,他们说用中点对应的元素作为根节点,我不知道怎么证明,有知道的小伙伴欢迎留言告诉我。

按照这个思路,

代码如下:

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     public TreeNode sortedArrayToBST(int[] nums) {
12         if(nums==null||nums.length==0)
13             return null;
14         return helper(nums,0,nums.length-1);
15     }
16     public TreeNode helper(int[] nums,int l,int r)
17     {
18         if(l>r)
19             return null;
20         int mid=l+(r-l)/2;
21         TreeNode root=new TreeNode(nums[mid]);
22         root.left=helper(nums,l,mid-1);
23         root.right=helper(nums,mid+1,r);
24         return root;
25     }
26 }

猜你喜欢

转载自www.cnblogs.com/cold-windy/p/11779244.html
今日推荐