递归

自顶向下

//先交换顶层节点,再交换底层节点
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;
}

JacksonHuang
74 声望3 粉丝