递归
自顶向下
//先交换顶层节点,再交换底层节点
var invertTree = function(root) {
if(root === null) return null;
//交换左右结点
var tmp = root.left;
root.left = root.right;
root.right = tmp;
if(root.left){
invertTree(root.left);
}
if(root.right){
invertTree(root.right);
}
return root;
};
自底向上
//先交换底层节点,再交换顶层节点
var invertTree = function(root) {
//定义递归返回的条件
if(!root) return null;
//先使用递归找到最底层的左右子树
let left = invertTree(root.left);
let right = invertTree(root.right);
//分别交换左右子树
root.right = left;
root.left = right;
return root;
}
迭代
思路:维护一个数组,这个数组里面存放的是没有交换过左右子树的节点
//思路:维护一个数组,这个数组里面存放的是没有交换过左右子树的节点
//自顶向下
var invertTree = function(root) {
if(!root) return null;
//这个数组一开始存放的只有根结点
var arr = [root];
while(arr.length) {
let current = arr.pop();
//分别交换current节点的左右子树
let temp = current.left;
current.left = current.right;
current.right = temp;
//再判断current节点的左右子树是否存在,如果存在则放进数组
if(current.left) arr.push(current.left);
if(current.right) arr.push(current.right);
}
return root;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。