剑指笔记——27 二叉树的镜像

题目:请完成一个函数,输入一棵二叉树,该函数输出它的镜像。

思路:可以使用递归和非递归(循环)的形式写代码。

递归代码,原文链接:https://blog.csdn.net/hh_zheng/article/details/78742895

递归代码的主要思想是先前序遍历这棵树的每一个节点,如果遍历到的节点有子节点,就交换它的两个节点。当交换完所有非叶子结点的左右节点之后,就得到了树的镜像。

非递归代码的主要思想好像也是用前序遍历,这个不太确定。使用了栈来实现。

代码:

递归代码:

public static void mirrorTree(TreeNode root){
        //递归结束条件
        if(root==null)
            return;
        if(root.left==null&&root.right==null) //找到叶子节点
            return;
        //必须先交换上层节点的左右子树
        TreeNode temp=root.left;
        root.left=root.right;
        root.right=temp;
        
        //递归翻转左右子树
        if(root.left!=null){
            mirrorTree(root.left);
        }
        if(root.right!=null){
            mirrorTree(root.right);
        }
    }

非递归代码:

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

Stack<TreeNode> stack = new Stack<>();
     while (root != null || !stack.isEmpty()) {
           while (root != null) {
                  TreeNode temp = root.left; //交换位置
                  root.left = root.right;
                   root.right = temp;
                   stack.push(root);  //从根节点开始先一直检查到最左边的节点
                    root = root.left;
                   }
          if (!stack.isEmpty()) {   //将左节点都处理完后,从栈中取出节点处理右节点
                  root = stack.pop();
                 root = root.right;
                  }
        }
}



 

猜你喜欢

转载自blog.csdn.net/chenxy132/article/details/89073905
今日推荐