NO.141 环形链表 简单
震惊!著名软件 Homebrew 的作者 Max Howell 在 面试 Google 被拒,竟然是因为不会这个!
Google:我们 90% 的工程师都用你写的软件(Homebrew),但你没法在白板上翻转二叉树,所以滚蛋吧
思路一:深度优先遍历 从根节点开始,交换左右子树,然后递归的交换左右子树的左右子树。终止条件是子树节点为空。
public TreeNode invertTree(TreeNode root) {
//节点为空终止
if (root ==null) return root;
//交换根节点的左右子树
TreeNode temp = root.right;
root.right = root.left;
root.left = temp;
//分别交换左右子树的左右子树
invertTree(root.right);
invertTree(root.left);
return root;
}
时间复杂度:O(n) 空间复杂度:O(h) h 是树高
思路二:广度优先遍历 广搜二叉树,并且遍历过程中交换树中所有节点的左子树和右子树 。
public TreeNode invertTree(TreeNode root) {
if (root == null) return root;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode poll = queue.poll();
//交换左右子树
TreeNode temp = poll.right;
poll.right = poll.left;
poll.left = temp;
//左右子树不空,则入队
if (poll.left != null) queue.offer(poll.left);
if (poll.right != null) queue.offer(poll.right);
}
return root;
}
时间复杂度:O(n) 空间复杂度:O(w) 树的最大宽度 w
最后再卑微的啰嗦一句:码字不易,如果有帮助到你请点赞关注+收藏哦!
本人菜鸟,有错误请告知,感激不尽!