通過有序陣列生成平衡搜尋二叉樹 & 有序連結串列轉換二叉搜尋樹(力扣)
阿新 • • 發佈:2022-02-19
通過有序陣列生成平衡搜尋二叉樹
《程式設計師程式碼面試指南》第46題 P152 難度:士★☆☆☆
通過陣列生成很簡單,只需要用有序陣列最中間的數生成搜尋二叉樹的頭節點,然後其左邊和右邊的數分別作為頭節點的左子樹和右子樹即可,然後再往下遞迴,最終生成整棵二叉樹。
public Node generateTree(int[] sortArr) { if (sortArr == null) { return null; } return generate(sortArr, 0, sortArr.length - 1); } public Node generate(int[] sortArr, int start, int end) { if (start > end) { return null; } int mid = (start + end) / 2; Node head = new Node(sortArr[mid]); head.left = generate(sortArr, start, mid - 1); head.right = generate(sortArr, mid + 1, end); return head; }
有序連結串列轉換二叉搜尋樹
力扣第109題 難度:中等
和上題一樣,同樣是用中間節點作為二叉樹的根節點,左右邊作為其左右子樹。不過連結串列不好直接用索引很方便的訪問,而且單向連結串列也不好向前遍歷。因此思路不完全一樣。
官方題解:有序連結串列轉換二叉搜尋樹——題解
兩種方法都是分治法(雖然沒學過,不過大概是那個意思)。
方法一通過快慢指標來定位中間節點,時間複雜度:O(nlogn),空間複雜度:
class Solution { public TreeNode sortedListToBST(ListNode head) { return buildTree(head, null); } public TreeNode buildTree(ListNode left, ListNode right) { if (left == right) { return null; } ListNode mid = getMedian(left, right); TreeNode root = new TreeNode(mid.val); root.left = buildTree(left, mid); root.right = buildTree(mid.next, right); return root; } public ListNode getMedian(ListNode left, ListNode right) { ListNode fast = left; ListNode slow = left; while (fast != right && fast.next != right) { fast = fast.next; fast = fast.next; slow = slow.next; } return slow; } } 作者:LeetCode-Solution 連結:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/solution/you-xu-lian-biao-zhuan-huan-er-cha-sou-suo-shu-1-3/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
方法二為分治+中序遍歷優化,將這兩者結合起來,時間複雜度:O(n),空間複雜度:
class Solution { ListNode globalHead; public TreeNode sortedListToBST(ListNode head) { globalHead = head; int length = getLength(head); return buildTree(0, length - 1); } public int getLength(ListNode head) { int ret = 0; while (head != null) { ++ret; head = head.next; } return ret; } public TreeNode buildTree(int left, int right) { if (left > right) { return null; } int mid = (left + right + 1) / 2; TreeNode root = new TreeNode(); root.left = buildTree(left, mid - 1); root.val = globalHead.val; globalHead = globalHead.next; root.right = buildTree(mid + 1, right); return root; } } 作者:LeetCode-Solution 連結:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/solution/you-xu-lian-biao-zhuan-huan-er-cha-sou-suo-shu-1-3/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。