• leetcode 108.将有序数组转换为二叉搜索树


    思路一:在数据结构中,我们曾经学到过这样一个东西:二分搜索树(不是BST),这个树是根据二分搜索的搜索顺序而画出来的树。这棵树的特点就是它是绝对平衡的,并且是有序的。既然我们可以根据二分搜索的顺序来构建平衡二叉搜索树,那么我们就可以将原数组排成二分搜索此数组的顺序,这里用了集合容器作为额外空间存储。至于二分搜索的顺序模拟,是根据分冶来的。

    然后就是树的构建,是数据结构的基础。注意:我们在写树的创建函数时,一定要返回一个值,因为我们的结点在创建以后并不会归到树中,需要我们人为的赋给这个空指针结点才行,不然会不存在。

    这一种思路写起来其实挺麻烦的,但是思路很清晰。另外就是因为作者认为,这棵树需要实时是平衡二叉树才行,刚开始还把思路向着旋转那里去想了,结果手写特别麻烦,就没有采用那种思路。后来发现只要构建的树最后是平衡的就行,而不需要在创建的时候就一步一步都得是平衡树。

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode() {}
    8. * TreeNode(int val) { this.val = val; }
    9. * TreeNode(int val, TreeNode left, TreeNode right) {
    10. * this.val = val;
    11. * this.left = left;
    12. * this.right = right;
    13. * }
    14. * }
    15. */
    16. class Solution {
    17. List<Integer>list=new ArrayList<>();
    18. public TreeNode sortedArrayToBST(int[] nums) {
    19. if(nums.length<=0)
    20. return null;
    21. finds(nums);
    22. TreeNode root=new TreeNode(nums[nums.length/2],null,null);
    23. if(nums.length!=2){
    24. for(int i=1;i<list.size();i++){
    25. create(root,list.get(i));
    26. }
    27. return root;
    28. }
    29. else{
    30. for(int i=0;i<list.size();i++){
    31. create(root,list.get(i));
    32. }
    33. return root;
    34. }
    35. }
    36. public void finds(int []nums){
    37. if(nums.length<=0)
    38. return;
    39. if(nums.length==1){
    40. list.add(nums[0]);
    41. return;
    42. }
    43. if(nums.length==2){
    44. list.add(nums[0]);
    45. list.add(nums[1]);
    46. return;
    47. }
    48. list.add(nums[nums.length/2]);
    49. int []left=new int[nums.length/2];
    50. int []right=new int[nums.length-nums.length/2-1];
    51. for(int i=0;i<nums.length/2;i++){
    52. left[i]=nums[i];
    53. }
    54. int k=0;
    55. for(int i=nums.length/2+1;i<nums.length;i++){
    56. right[k++]=nums[i];
    57. }
    58. finds(left);
    59. finds(right);
    60. }
    61. public TreeNode create(TreeNode root,int val){
    62. if(root==null){
    63. TreeNode tmp=new TreeNode(val,null,null);
    64. return tmp;
    65. }
    66. if(root.val>val){
    67. root.left=create(root.left,val);
    68. }
    69. else if(root.val<val){
    70. root.right=create(root.right,val);
    71. }
    72. return root;
    73. }
    74. }

    思路二:因为二叉搜索树的中序遍历正是一个升序的序列,所以我们可以任取一个结点,它的左边就是左子树,右边就是右子树。但又因为需要平衡,所以我们选择中间结点作为根,这样可以保证左右结点平衡,可以通过分冶递归实现。

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

  • 相关阅读:
    四、Mediasoup Js和 C++ 管道通信的过程
    强化学习之REINFORECE策略梯度算法——已CartPole环境为例
    GBase 8c V3.0.0数据类型——时间/日期函数
    【vue3】12.跟着官网学习vue3-侦听器,watch方法
    物理信息驱动深度学习相关报告总结
    【系统开发】简易信息管理系统开发
    EN 14342木地板产品—CE认证
    Aardio 第一天:使用虚表和适配器
    java面试强基(9)
    Linux下企业级夜莺监控分析工具的远程访问设置【内网穿透】
  • 原文地址:https://blog.csdn.net/m0_73917165/article/details/142217977