恢復二叉搜尋樹

2021-09-24 20:26:39 字數 820 閱讀 4293

題目:

二叉搜尋樹中的兩個節點被錯誤地交換。

請在不改變其結構的情況下,恢復這棵樹。

示例 1:

輸入: [1,3,null,null,2]1/

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

1\2示例 2:

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

3/ \

1   4/2

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

2/ \

1   4/3

分析:方法(1):中序遍歷二叉樹(根據二叉樹中序遍歷公升序特性),用全域性變數first和second指標記錄下這兩個發生錯誤的結點,然後交換這兩個節點中的關鍵字需要注意的是,還要用乙個指標記錄所遍歷當前結點的前乙個結點,當前第一次遇到前乙個結點值大於後乙個值時,就將first和second置為這兩個節點,當後面還有機會遇到這樣的條件時,直接更新second值(說明第一次的first和最後一次的second才是真正傳送錯誤位置的結點,則將二者值交換即可).o(n)時間,o(1)空間

class solution 

else//不是第一次遇到(更新second)

}pre=root;//始終讓pre在root(當前結點的前面)

inorder(root->right);

}void recovertree(treenode* root)

};

方法(2):可以先中序遍歷二叉樹,將遍歷關鍵值放在陣列中,然後對其進行排序,然後用排好序的關鍵值取覆蓋二叉樹結點的值(該過程再進行一次中序遍歷),這樣有序的關鍵字就會覆蓋二叉樹原來的結點中的關鍵值。

恢復二叉搜尋樹

二叉搜尋樹中序遍歷是乙個有序序列。交換其中兩個節點相當於在有序序列中交換了兩個數,我們只需找到這兩個數,把它們交換回來即可。有兩種情況 1.相鄰兩個數字交換 1,2,3,4,5,6 交換2,3變為 1,3,2,4,5,6 只有一組逆序對,中序遍歷記錄前驅,然後找到這兩數交換即可 2.不相鄰兩個數字交...

恢復二叉搜尋樹

在一棵二叉搜尋樹中,只有兩個節點是被交換的.找到這些節點並交換,如果沒有節點被交換就返回原來的樹的根節點.樣例1 輸入 輸出 解釋 給出的二叉搜尋樹 4 5 2 1 3 返回 4 2 5 1 3樣例2 輸入 輸出 解釋 給出的二叉搜尋樹 1 2 5 4 3 返回 4 2 5 1 3 definiti...

恢復二叉搜尋樹

二叉搜尋樹 bst 中的兩個節點被錯誤地交換了,請在不改變樹的結構的情況下恢復這棵樹。思路 二叉樹兩個節點被交換,存在兩種情況。case 1 是父節點和子節點被交換。case 2 是不相鄰的兩個節點被交換。利用二叉樹搜尋樹中序遍歷有序性,如果是case 1,則發生逆序的兩個節點為需要交換值的兩個節點...