Convert to Binary Search Tree

来源:互联网 发布:四川省网络研修 编辑:程序博客网 时间:2024/06/05 06:40

108. Convert Sorted Array to Binary Search Tree
题目:将一个有序数组转化为一个二叉排序树
思路:数组中间那个节点为树的根节点,根节点的左子树节点应该是根节点左边那部分的中间节点,根节点的右节点应该是根节点右边那部分的中间节点,后面就按照这个规律依次类推了。

public class LeetCode108 {    public class TreeNode {       int val;       TreeNode left;       TreeNode right;       TreeNode(int x) { val = x; }    }    public TreeNode sortedArrayToBST(int[] nums) {           if(nums.length == 0) return null;         return buildTree(nums, 0, nums.length - 1);       }      public TreeNode buildTree(int[] nums, int start, int end){        if(start <= end){            int mid = (start + end) / 2;            TreeNode root = new TreeNode(nums[mid]); // 数组中间节点为树的根节点            root.left = buildTree(nums, start, mid - 1);            root.right = buildTree(nums, mid + 1, end);            return root;        }        else            return null;    }}

109. Convert Sorted List to Binary Search Tree
题目:将一个有序链表转化为一个二叉排序树
思路: 如果是一棵相对平衡的排序树,应该是这样的:
1. 链表中间那个节点为树的根节点
2. 根节点的左子树节点应该是根节点左边那部分的中间节点
知道上面的规律之后,问题的关键点就是寻找一个链表的中间节点了,用快慢两个指针可以轻松解决。

public class LeetCode109 {    public class ListNode {       int val;       ListNode next;       ListNode(int x) { val = x; }      }    public class TreeNode {        int val;        TreeNode left;        TreeNode right;        TreeNode(int x) { val = x; }      }    public TreeNode sortedListToBST(ListNode head) {        ListNode slow = head;        ListNode fast = head;        ListNode lend = null;        if(head == null) return null;              //递归结束条件       // 找中间节点,即树的根节点        while(fast != null && fast.next != null){            lend = slow;                            // lend记录前半部分的最后一个,即左子树的最后一个            slow = slow.next;            fast = fast.next.next;        }        if(lend == null){         //说明没有进入上面的while循环 说明这时候只有1个节点  这时候就不存在左链表的左半部分了              head = null;        }        else{            lend.next = null;     //如果有左半部分则把左半部分链表的末尾指向空,将链表截两段        }        TreeNode root = new TreeNode(slow.val);        root.left = sortedListToBST(head);        root.right = sortedListToBST(slow.next);    // slow.next链表右半部分的开始         return root;    }}
0 0
原创粉丝点击