剑指Offer---面试题19:镜像二叉树

来源:互联网 发布:系统内存优化级别默认 编辑:程序博客网 时间:2024/05/16 06:13

一.题目

操作给定的二叉树,将其变换为源二叉树的镜像。

public class TreeNode {    int val = 0;    TreeNode left = null;    TreeNode right = null;public TreeNode(int val) {    this.val = val;}}

二.分析

以题目中的两棵树为例:


就是先序遍历这棵树,如果当前正在遍历的节点有子结点(无论是左还是右),就交换两个子节点,当交换完所有的非叶子结点的左右子结点的时候,就得到了树的镜像.

具体过程如下所示:


注意6和10交换之后,第三层结点的排列顺序


三.代码

递归实现:

public void Mirror(TreeNode root) {    //递归    if(root==null||(root.left==null&&root.right==null)){        return;    }    //swap    TreeNode tmpNode=root.left;    root.left=root.right;    root.right=tmpNode;    if(root.left!=null){        Mirror(root.left);    }    if(root.right!=null){        Mirror(root.right);    }}

非递归实现:

public void Mirror(TreeNode root) {    if(root==null||(root.left==null&&root.right==null)){        return;    }    //用于存放结点    Stack <TreeNode> stack=new Stack<TreeNode>();    stack.push(root);    while(!stack.isEmpty()){        TreeNode node=stack.pop();        if(node.left!=null||node.right!=null){//只要该节点有子节点,就交换子节点位置            //swap            TreeNode tmpNode=node.left;            node.left=node.right;            node.right=tmpNode;        }        //将左节点入栈        if(node.left!=null){            stack.push(node.left);        }        //将右节点入栈         if(node.right!=null){            stack.push(node.right);        }    }}
0 0
原创粉丝点击