leetcode 99恢復二叉搜尋樹

2021-10-10 10:12:08 字數 1940 閱讀 5077

給你二叉搜尋樹的根節點 root ,該樹中的兩個節點被錯誤地交換。請在不改變其結構的情況下,恢復這棵樹。

高階:使用 o(n) 空間複雜度的解法很容易實現。你能想出乙個只使用常數空間的解決方案嗎?

題目要求的是二叉搜尋樹,二叉搜尋樹有乙個特點,那就是有序,所以我們可以得知在中序遍歷二叉搜尋樹得到的序列是遞增的。

現在題目給出有兩個節點被錯誤的交換了,那在中序遍歷的序列中就可以體現出來了,那就是裡面有資料是非遞增的,也就是存在nums[i] > nums[i+1],如果是相鄰的兩個節點被交換了,那就只有乙個位置進行了交換,如果不是那就存在兩個位置的進行了交換。即nums[i] > nums[i+1]或nums[i] > nums[i+1] 和 nums[j] > nums[j+1]。

由此可以確定解題思路:

**如下:

public

void

recovertree

(treenode root)

/** * 中序遍歷

* * @param root

* @param nums

*/public

void

inorder

(treenode root, list

nums)

inorder

(root.left, nums)

; nums.

add(root.val)

;inorder

(root.right, nums);}

/** * 找到交換了資料的位置

* * @param nums

* @return

*/public

int[

](list

nums)

else}}

return

newint

;}/** * 還原二叉搜尋樹

* @param root

* @param count 交換的次數

* @param x 交換的節點1

* @param y 交換的節點2

時間複雜度為:o(n),n為二叉樹的節點

空間複雜度為:o(n)

第一種方法使用了額外的陣列來儲存中序遍歷得到的序列,所以空間複雜度為o(n),可以不需要額外的空間進行儲存序列,也能找到兩個交換的節點,那就是在中序遍歷的時候進行判斷,判斷後面的節點是否小於當前節點。

使用迭代進行中序遍歷:

**如下:

public

void

recovertree

(treenode root)

root = stack.

pop();

if(pre != null && pre.val > root.val)

else

} pre = root;

root = root.right;

}swap

(x,y);}

/** * 交換函式

* @param x

* @param y

*/public

void

swap

(treenode x,treenode y)

刷了一些leetcode,然後來寫一些部落格,加深自己解題的思路。

Leetcode99 恢復二叉搜尋樹

第一次寫這個部落格以後我發現我理解錯了題目,但是我的問題更具有一般性,更複雜,所以文章就不改了 題目 只有兩個結點被錯誤的交換。我的 有任意多個結點被錯誤的交換。先分析題目 使用o n 空間複雜度的解法很容易實現,那麼我們先看看很容易實現是怎實現的。1 中序遍歷二叉樹,並將中序序列儲存在乙個陣列nu...

LeetCode 99 恢復二叉搜尋樹

3 1 2示例 2 輸入 3,1,4,null,null,2 3 1 4 2 輸出 2,1,4,null,null,3 2 1 4 3 高階 使用 o n 空間複雜度的解法很容易實現。你能想出乙個只使用常數空間的解決方案嗎?1.中序遍歷,儲存陣列 2.排序陣列 3.重新賦值,恢復二叉樹 includ...

LeetCode99 恢復二叉搜尋樹

二叉搜尋樹中的兩個節點被錯誤地交換。請在不改變其結構的情況下,恢復這棵樹。樹節點的定義 definition for a binary tree node.public class treenode treenode int val treenode int val,treenode left,tr...