トピック:
二分木を反転します。
例:
入る:
4
/ \
2 7
/ \ / \
1 3 6 9
出力:
4
/ \
7 2
/ \ / \
9 6 3 1
注:
この質問は、MaxHowellの元の質問に触発されています。
Google:エンジニアの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);
}
時間計算量:オン
スペースの複雑さ: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;
}
時間計算量:オン
スペースの複雑さ: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;
}
時間計算量:オン
スペースの複雑さ:オン
解決策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;
}
時間計算量:オン
スペースの複雑さ:オン