LeetCode 重構二叉搜尋數,即找出兩個被交換的節點
題意:二叉搜尋樹中,有兩個結點的位置被交換了,請找出這兩個結點並交換回來。
“直觀的想法可能是中序遍歷一遍二叉樹,得到一個有序的二叉樹,然後找出其中逆序的地方,交換回來就好了。但這樣空間複雜度就是O(n),題目要求O(1)。
我們來分析下有哪些情況:1) 被交換的兩個結點相鄰,如124356,這樣只需要把相鄰的3和4交換回來即可;2) 被交換的兩個結點不相鄰,如163452,這樣我們需要找出兩個逆序的地方,63和52,並交換第一個逆序的前者和第二個逆序的後者。”(http://blog.csdn.net/ljiabin/article/details/44514651該博主很認真解釋了一下,不然光看程式還真看不懂)。因為這兩種情況存在,而且這可二叉樹只有兩個節點被交換了,所以我們需要定位這兩個節點,而不是將相鄰節點一對一對的交換達到這種效果。這一點也是最精妙的地方,程式中mistake1記錄的最底下出錯的節點,mistake2記錄的是中序遍歷中較mistake1後面的節點。
相關推薦
LeetCode 重構二叉搜尋數,即找出兩個被交換的節點
題意:二叉搜尋樹中,有兩個結點的位置被交換了,請找出這兩個結點並交換回來。 “直觀的想法可能是中序遍歷一遍二叉樹,得到一個有序的二叉樹,然後找出其中逆序的地方,交換回來就好了。但這樣空間複雜度就是O(n),題目要求O(1)。 我們來分析下有哪些情況:1) 被交換的兩個結點相鄰,如124356,這樣只需要把相
《劍指offer》給定一顆二叉搜尋樹,請找出其中的第k大的結點。
題目:給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。 解析:看到我寫的下面的程式碼,像一篇文章一樣的長,我也是醉了,先提交上去了。思想就是先來個層次遍歷二叉樹,得
LeetCode:4. Median of Two Sorted Arrays(找出兩個有序陣列的中間數)
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall
LeetCode:160. Intersection of Two Linked Lists(找出兩個連結串列的交點)
Write a program to find the node at which the intersection of two singly linked lists begins. For example, the following two linked lists:
leetcode#501. 二叉搜尋樹中的眾數
class Solution { public: int maxFreq = 0, currFreq = 0, precursor = INT_MIN; vector<int>
LeetCode 501 二叉搜尋樹中的眾數
基礎版,利用hash,即python中的字典,key存節點,value存出現的次數 class solution: def findMode(self, root): tmp = {} ans = [] if not
Leetcode 230.二叉搜尋樹第k小的數
二叉搜尋樹第k小的數 給定一個二叉搜尋樹,編寫一個函式 kthSmallest 來查詢其中第 k 個最小的元素。 說明:你可以假設 k 總是有效的,1 ≤ k ≤ 二叉搜尋樹元素個數。 示例 1: 輸入: root = [3,1,4,null,2], k
leetcode 700. 二叉搜尋樹中的搜尋(python)
給定二叉搜尋樹(BST)的根節點和一個值。 你需要在BST中找到節點值等於給定值的節點。 返回以該節點為根的子樹。 如果節點不存在,則返回 NULL。 例如, 給定二叉搜尋樹: 4 / \ 2 7 / \ 1 3 和值:
leetcode 783. 二叉搜尋樹結點最小距離(遞迴和非遞迴實現java)
題目描述: 給定一個二叉搜尋樹的根結點 root, 返回樹中任意兩節點的差的最小值。 示例: 輸入: root = [4,2,6,1,3,null,null] 輸出: 1 解釋: 注意,root是樹結點物件(TreeNode object),而不是陣列。 給定的樹 [4,
leetcode 235. 二叉搜尋樹的最近公共祖先(Python)[Easy]
題目: 給定一個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。 百度百科中最近公共祖先的定義為:“對於有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度儘可能大(一個節點也可以是它自己的祖先)。” 例如,給定如下二叉搜尋樹:&
leetcode 938. 二叉搜尋樹的範圍和
給定二叉搜尋樹的根結點 root,返回 L 和 R(含)之間的所有結點的值的和。 二叉搜尋樹保證具有唯一的值。 示例 1: 輸入:root = [10,5,15,3,7,null,18], L = 7, R = 15 輸出:32
LeetCode 700——二叉搜尋樹中的搜尋
1. 題目 2. 解答 如果根節點為空,直接返回 NULL。如果根節點非空,從根節點開始迴圈查詢,直到節點為空。 如果待查詢的值大於當前節點值,節點指向右孩子; 如果待查詢的值小於當前節點值,節點指向左孩子; 如果待查詢的值等於當前節點值,返回當前節點。 若迴圈結束還沒有找到,返
Leetcode 938.二叉搜尋樹的範圍和Java&Python
給定二叉搜尋樹的根結點 root,返回 L 和 R(含)之間的所有結點的值的和。 二叉搜尋樹保證具有唯一的值。 示例 1: 輸入:root = [10,5,15,3,7,null,18], L = 7, R = 15 輸出:32 示例 2:
LeetCode——938 二叉搜尋樹的範圍和
給定二叉搜尋樹的根結點 root,返回 L 和 R(含)之間的所有結點的值的和。 二叉搜尋樹保證具有唯一的值。 示例 1: 輸入:root = [10,5,15,3,7,null,18], L = 7, R = 15 輸出:32 示例 2: 輸入:root = [10,
Leetcode 230. 二叉搜尋樹中第K小的元素 C++
題目描述 方法一(中序歷遍思想) 使用樹的中序歷遍,對於二叉搜尋樹,樹的中序歷遍得到的就是按照從小到大排序的一個序列。這裡做了適當的改進,歷遍的時候不再將數值儲存到一個數組中,這樣就不需要佔用記憶體。直接通過記錄當前歷遍到第 i 個值(即第 i 大的數),和要求的 K 比較,相
LeetCode--230.二叉搜尋樹中第K小的元素(JavaScript)
給定一個二叉搜尋樹,編寫一個函式 kthSmallest 來查詢其中第 k 個最小的元素。 說明: 你可以假設 k 總是有效的,1 ≤ k ≤ 二叉搜尋樹元素個數。 示例 1: 輸入: root = [3,1,4,null,2], k = 1 3 / \ 1 4
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列(劍指offer)
題目 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。 分析: 在二叉搜尋樹中,每個結點都有兩個分別指向其左、右子樹的指標,左子樹結點的值總是小於父結點的值,右子樹結點的值總是大於父結點的值。在雙向連結串列中,每個結點
leetcode 173. 二叉搜尋樹迭代器
實現一個二叉搜尋樹迭代器。你將使用二叉搜尋樹的根節點初始化迭代器。 呼叫 next() 將返回二叉搜尋樹中的下一個最小的數。 注意: next() 和hasNext() 操作的時間複雜
Leetcode: 449.二叉搜尋樹的序列化和反序列化
序列化是將資料結構或物件轉換為一系列位的過程,以便它可以儲存在檔案或記憶體緩衝區中,或通過網路連線鏈路傳輸,以便稍後在同一個或另一個計算機環境中重建。 設計一個演算法來序列化和反序列化二叉搜尋樹。 對序列化/反序列化演算法的工作方式沒有限制。 您只需確保二叉搜尋樹可以序列化為字串,並且可以將該字
leetcode 783. 二叉搜尋樹結點最小距離(java)
題目描述: 給定一個二叉搜尋樹的根結點 root, 返回樹中任意兩節點的差的最小值。 示例: 輸入: root = [4,2,6,1,3,null,null] 輸出: 1 解釋: 注意,root是