226. 翻轉二叉樹(java實現)--LeetCode
阿新 • • 發佈:2021-02-03
文章目錄
題目:
翻轉一棵二叉樹。
示例:
輸入:
4
/ \
2 7
/ \ / \
1 3 6 9
輸出:
4
/ \
7 2
/ \ / \
9 6 3 1
備註:
這個問題是受到 Max Howell 的 原問題 啟發的 :
谷歌:我們90%的工程師使用您編寫的軟體(Homebrew),但是您卻無法在面試時在白板上寫出翻轉二叉樹這道題,這太糟糕了。
解法1:遞迴(從上到下)
/**
* 思路:
* 本質上就是左右節點互換
* 從根節點開始,不斷的向下遞迴,把每層的左右節點互換就可以
*/
public TreeNode invertTree(TreeNode root) {
recursive(root);
return root;
}
private void recursive(TreeNode root) {
if (root==null)return ;
TreeNode tmp = root.right;
root.right=root.left;
root.left=tmp;
recursive(root.left);
recursive(root.right);
}
時間複雜度:On
空間複雜度:O1
解法2:遞迴(自下到上)
/**
* 思路:
* 本質上就是左右節點互換
* 從葉子節點開始,互換,不斷的向上遞迴
*/
public TreeNode invertTree(TreeNode root) {
if (root==null)return null;
TreeNode right = invertTree(root.right);
TreeNode left = invertTree(root.left);
root.left=right;
root.right=left;
return root;
}
時間複雜度:On
空間複雜度:O1
解法3:佇列
/**
* 思路:
* 把root放入佇列,佇列不為null,一直迭代
* 之後互換其左右,只要左右節點存在就入隊
*/
public TreeNode invertTree(TreeNode root) {
if (root == null) return null;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()){
TreeNode poll = queue.poll();
TreeNode left = poll.left;
poll.left=poll.right;
poll.right=left;
if (poll.left!=null)queue.offer(poll.left);
if (poll.right!=null)queue.offer(poll.right);
}
return root;
}
時間複雜度:On
空間複雜度:On
解法4:棧(和佇列的程式碼完全一樣)
public TreeNode invertTree(TreeNode root) {
if (root==null)return root;
ArrayDeque<TreeNode> stak = new ArrayDeque<>();
stak.push(root);
while (!stak.isEmpty()){
TreeNode pop = stak.pop();
TreeNode tmp = pop.left;
pop.left=pop.right;
pop.right=tmp;
if (pop.left!=null)stak.push(pop.left);
if (pop.right!=null)stak.push(pop.right);
}
return root;
}
時間複雜度:On
空間複雜度:On