二叉搜尋樹中序遍歷是乙個有序序列。交換其中兩個節點相當於在有序序列中交換了兩個數,我們只需找到這兩個數,把它們交換回來即可。有兩種情況:
1.相鄰兩個數字交換:[1,2,3,4,5,6]交換2,3變為[1,3,2,4,5,6],只有一組逆序對,中序遍歷記錄前驅,然後找到這兩數交換即可;
2.不相鄰兩個數字交換:[1,2,3,4,5,6]交換2,6變為[1,6,3,4,5,2],此時有兩組逆序對,6,3和5,2,所以我們只需要找到這兩組逆序對,然後把第一組前乙個數字和第二組後乙個數字進行交換即可。
所以需要乙個記錄前驅的指標pre,當前驅大於當前結點,此時是乙個逆序對,用兩個指標first,second記錄;如果有第二個逆序對,更新second為當前結點,最後交換first,second指向結點的數值即可。
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
pre=root;
}inorder
(root-
>right,pre,first,second);}
void
recovertree
(treenode* root)
};
恢復二叉搜尋樹
題目 二叉搜尋樹中的兩個節點被錯誤地交換。請在不改變其結構的情況下,恢復這棵樹。示例 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 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,則發生逆序的兩個節點為需要交換值的兩個節點...