阿哈时刻:

知道为什么改变TreeNode.val 无效了!答案里面实现镜像的方法是改变引用,而我刚开始则是期望通过改变值,来实现二叉树镜像反转的功能,但是,现实情况是,有些二叉树根本就不是我想的那种节点很全的那种,总有些缺胳膊断腿的,那种你通过改变值val当然是无效的,只能改变地址引用,来实现二叉树镜像功能了!

递归遍历,二叉树过程中,可以做的改变很多,无论二叉树是否中途,有没有返回值,要理解的是,递归的本质,即是:

如果是后序遍历,遍历顺序,一定是先从左右根,而且是从下到上,从左到右,再到root节点到。

那二叉树镜像反转的递归,依旧逃不出这个顺序和过程,只是,我们可以在这个过程中中途可以做很多手脚,

改变值,交互值等等都是可以的。所以,二叉树镜像反转的过程,画个图是这样的:

解题思路:

1、递归的方法,二叉树的后序遍历,就跟之前的,后序遍历一摸一样的:

void postOrderTree(TreeNode root){
    if(root == null) return;
    postOrderTree(root.left);
    postOrderTree(root.right);
    print("val:" + root.val);
}

具体有个区别,就是可以返回值,这带来了很大的改变,递归的过程一样,只是有返回值,还有可以操作。

    public TreeNode Mirror (TreeNode pRoot) {
        if (pRoot == null) {
            return null;
        }

        TreeNode left = Mirror(pRoot.left); //1. 后序遍历左子节点
        TreeNode right = Mirror(pRoot.right); //2. 后序遍历左子节点

        //3. visit t,操作目标节点
        pRoot.left = right;
        pRoot.right = left;
        return pRoot;
    }

import java.util.*;

public class Solution {
    /**
     * 递归方法,改变二叉树
     * @param pRoot TreeNode类
     * @return TreeNode类
     */
    
    // 本质上是一种二叉树的后续遍历
    // 这个比较特别的是可以返回值
    // 中途也可以对值做交换
    // 跟之前的二叉搜索树变双向链表很像
    public TreeNode Mirror2 (TreeNode pRoot) {
        if (pRoot == null) {
            return null;
        }

        TreeNode left = Mirror(pRoot.left); //1. 后序遍历左子节点
        TreeNode right = Mirror(pRoot.right); //2. 后序遍历左子节点

        //3. visit t,操作目标节点
        pRoot.left = right;
        pRoot.right = left;
        return pRoot;
    }

	/**
	 * 使用栈方法,遍历过程中改变二叉树
	 */
    public TreeNode Mirror (TreeNode pRoot) {
        if(pRoot == null) {
            return null;
        }
        Stack<TreeNode> s = new Stack<>();
        s.push(pRoot);
        while(!s.isEmpty()) {
            TreeNode node = s.pop();
            if(node.left!=null) {
                s.push(node.left);
            }
            if(node.right!=null) {
                s.push(node.right);
            }
            TreeNode temp = node.left;
            node.left = node.right;
            node.right = temp;
        }
        return pRoot;
    }
   
}