有序鏈表轉換二叉搜索樹
阿新 • • 發佈:2018-07-14
樹的高度 有序數組 方法 ati 元素 vat static www pos
問題描述:
給定一個單鏈表,其中的元素按升序排序,將其轉換為高度平衡的二叉搜索樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:
給定的有序鏈表: [-10, -3, 0, 5, 9], 一個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜索樹: 0 / -3 9 / / -10 5
解題思路:
將鏈表先轉為數組,之後方法與將有序數組轉換為二叉搜索樹相同。
實現代碼:
private static TreeNode test(int[] nums, intlo, int hi) { if (lo < hi) return null; if (lo == hi) return new TreeNode(nums[hi]); int mid = (lo + hi) / 2; TreeNode node = new TreeNode(nums[mid]); node.left = test(nums, lo, mid-1); node.right = test(nums, mid+1, hi); return node; }public static TreeNode listToBST(ListNode head) { // 將鏈表轉為數組 ListNode temp = head; int len = 0; while (temp != null) { len++; temp = temp.next; } int[] nums = new int[len]; temp = head; len = 0; while (temp != null) { nums[len++] = temp.val; temp = temp.next; } return test(nums, 0, nums.length); }
方法2:
直接使用鏈表生成二叉搜索樹。
在遞歸生成二叉樹時,先求左子樹,再根節點,最後右子樹。
實現代碼:
private static TreeNode build(int lo, int hi) { if (lo > hi) return null; int mid = (lo + hi) / 2; // 先求左子樹 TreeNode left = build(lo, mid-1); // 構造節點 TreeNode node = new TreeNode(list.val); list = list.next; // 右子樹 TreeNode right = build(mid+1, hi); node.left = left; node.right = right; if (mid == (len-1)/2) root = node; return node; } public static TreeNode toBST(ListNode head) { // 計算鏈表總長度 list = head; while (head != null) { len++; head = head.next; } build(0, len-1); return root; }
有序鏈表轉換二叉搜索樹