27.二叉树的镜像
其实就是翻转二叉树。注意这题最后使用前序遍历。使用中序和后序有风险,具体请看下图中的分析。
题目
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
例如输入:
4
/ \
2 7
/ \ / \
1 3 6 9
镜像输出:
4
/ \
7 2
/ \ / \
9 6 3 1
示例 1:
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
为什么不建议利用中序或者后序遍历
这里我们使用中序遍历举例子,请看下面的分析:
中序遍历就是左中右的顺序,
代码
利用中左右的前序遍历的顺序,还是很好理解的。
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var mirrorTree = function(root) {
// 利用前序遍历 -> 中左右
if(root === null) return root
// 中
let temp = root.left
root.left = root.right
root.right = temp
// 左
mirrorTree(root.left)
// 右
mirrorTree(root.right)
return root
};
如果非想要用中序->左中右的顺序来遍历呢?
实际上根据我们上面图中分析的,我们将左边的树镜像了,然后放到了右边,然后又镜像了,相当于重复操作了,这个时候实际上我们应该操作左边的才对,所以非要使用中序遍历,顺序应该是左中左:
/*
* function TreeNode(x) {
* this.val = x;
* this.left = null;
* this.right = null;
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return TreeNode类
*/
function Mirror( pRoot ) {
// write code here
if(pRoot === null) return null
Mirror(pRoot.left)
let temp = pRoot.left
pRoot.left = pRoot.right
pRoot.right = temp
Mirror(pRoot.left)
return pRoot
}
module.exports = {
Mirror : Mirror
};