恢復二叉搜尋樹 二叉樹

2021-10-16 17:03:15 字數 1082 閱讀 6094

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

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

示例 1:

輸入:root = [1,3,null,null,2]

輸出:[3,1,null,null,2]

解釋:3 不能是 1 左孩子,因為 3 > 1 。交換 1 和 3 使二叉搜尋樹有效。

示例 2:

輸入:root = [3,1,4,null,null,2]

輸出:[2,1,4,null,null,3]

解釋:2 不能在 3 的右子樹中,因為 2 < 3 。交換 2 和 3 使二叉搜尋樹有效。

樹上節點的數目在範圍 [2, 1000] 內

-231 <= node.val <= 231 - 1

二叉樹搜尋樹中序遍歷就是二叉搜尋樹元素從小到大排列,知道這個就好做了。

採用中序遍歷:每個節點和前乙個相比,小的話就把前乙個節點記錄下來(只有第一次記錄前乙個節點,因為題目說明只有兩個元素錯位),然後下一次遇到前乙個元素比後面的元素大的情況把後乙個元素記錄下來。

最後把兩個記錄點的val交換。

/**

* definition for a binary tree node.

* struct treenode

* treenode(int x) : val(x), left(nullptr), right(nullptr) {}

* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}

* };

*/class solution

recover(root->left);

if (root->val < pre->val)

pre = root;

recover(root->right);

}void recovertree(treenode* root)

};

二叉樹 還原二叉樹 二叉搜尋樹

先序遍歷的特點 先遍歷根結點,再遍歷左子樹,最後再遍歷右子樹 中序遍歷的特點 先遍歷左子樹,再遍歷根結點,最後再遍歷右子樹 後序遍歷的特點 先遍歷左子樹,再遍歷右子樹,最後再遍歷根結點 舉例 先序遍歷 a b d f g h i e c 中序遍歷 f d h g i b e a c 如上,根據先序遍...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...

二叉樹3(恢復二叉樹)

給一顆帶權 權值各不相同,都是小於10000的正整數 的二叉樹的中序和後序遍歷序列,找乙個葉子使得它到根的路徑上的權值盡可能小,如果有多解,取葉子權值小的。輸入中第一行為中序遍歷,第二行為後序遍歷。例如輸入 3 2 1 4 5 7 6 3 1 2 5 6 7 4 輸出輸入 7 8 11 3 5 16...