题目
来源: 翻转二叉树
翻转一棵二叉树。
示例
解题思路及代码
1. 思路
递归的交换每个结点的左右子结点即可。
2.代码
var invertTree = function(root) {
if (root == null) {
return null;
}
var temp = root.right;
root.right =root.left;
root.left = temp;
invertTree(root.left);
invertTree(root.right);
return root;
};
另:
本题也可考虑用层序遍历,采用队列来存放遍历到的元素,首先将根结点放入队列中,然后取出该结点,并交换其左右子树,然后判断:当前结点的左子树是否为空?不为空则放入队列;当前结点的右子树是否为空?不为空则放入队列。然后继续取出队列中的每个结点,进行如上操作。
var invertTree = function(root) {
if (root == null) {
return null;
}
var temQueue = [root];
while (temQueue.length != 0) {
var temp = temQueue.shift();
var left = temp.right;
temp.right = temp.left;
temp.left = left;
if (temp.right != null) {
temQueue.push(temp.right);
}
if (temp.left != null) {
temQueue.push(temp.left);
}
}
return root;
};
总结
一开始也考虑到层序遍历,但是想的过于复杂,想着把每一层放进队列后再依次翻转,例如left = root.left 先放入队列,然后right = root.right 放入队列,然后取出left, 令root.right = left,left的左右子结点放入队列中。。。。主要还是对二叉树的特性没弄清楚,交换 root.left 和 root.right 实际上是交换了左右两个子树。
然后又想到如果将其翻转,实际上得到了其镜像二叉树,但是代码没调成功,而且这样也增加了空间复杂度。。。