二叉搜尋樹中的兩個節點被錯誤地交換。
請在不改變其結構的情況下,恢復這棵樹。
這道題的關鍵是找到兩個被錯誤交換的節點。
對於二叉搜尋樹,一定要把握住各個遍歷對應的特徵。
二叉搜尋樹+中序遍歷–> 可以得到乙個有序陣列。那麼問題轉化為:在乙個有序陣列中,將兩個數交換後,怎樣找到這兩個數。例如,[1 2 3 4 5 6 7 8] ,如果變成 [1 2 6 4 5 3 7 8],那麼這兩個數的特點是 6>4,5>3。
因此,最直接的方法是:
1)中序遍歷得到有序陣列
2)找到被交換節點
3)將樹中被交換節點的值交換
/**
* definition for a binary tree node.
* public class treenode
* treenode(int val)
* treenode(int val, treenode left, treenode right)
* }*/class
solution
private
void
inorder
(treenode root,list
nums)
inorder
(root.left,nums)
; nums.
add(root.val)
;inorder
(root.right,nums);}
private
int[
]findswap
(list
nums)
else}}
return
newint
;}private
void
recover
(treenode root,
int count,
int a,
int b)
if(root.val==a||root.val==b)
recover
(root.left,count,a,b)
;recover
(root.right,count,a,b);}
}
可以在中序遍歷過程中就找到不同的兩個節點,直接交換。
如果要得到中序遍歷的結果,應該採用棧的方式迭代遍歷。
/**
* definition for a binary tree node.
* public class treenode
* treenode(int val)
* treenode(int val, treenode left, treenode right)
* }*/class
solution
root=stack.
pop();
if(pred!=null&&pred.val>root.val)
else
} pred=root;
root=root.right;
}swap
(x,y);}
private
void
swap
(treenode a,treenode b)
}
待填坑。。。 99 恢復二叉搜尋樹
二叉搜尋樹中的兩個節點被錯誤地交換。請在不改變其結構的情況下,恢復這棵樹。示例 2 輸入 3,1,4,null,null,2 3 1 4 2輸出 2,1,4,null,null,3 2 1 4 3高階 使用 o n 空間複雜度的解法很容易實現。你能想出乙個只使用常數空間的解決方案嗎?在二叉搜尋樹中,...
99 恢復二叉搜尋樹
二叉搜尋樹中的兩個節點被錯誤地交換。請在不改變其結構的情況下,恢復這棵樹。示例 1 輸入 1,3,null,null,2 1 3 2輸出 3,1,null,null,2 3 1 2分析 1.假如乙個bst中序是4,2,3,1,我們發現要交換1和4,找到1和4並交換即可,通過觀察發現,第乙個要交換的節...
99 恢復二叉搜尋樹
二叉搜尋樹中的兩個節點被錯誤地交換。請在不改變其結構的情況下,恢復這棵樹。二叉搜尋樹中序遍歷為有序陣列,如 1,2,3,4,5,6 交換其中不相鄰任兩個,變成 1,6,3,4,5,2 會有兩個逆序對 6,3 和 5,2 可以看出交換位置為前一逆序對的前乙個元素和後一逆序對的後一元素。相鄰的話只有乙個...