剑指offer——二叉树的镜像
2016-07-29 22:57
435 查看
题目描述:
操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
思路:
仔细观察原二叉树与镜像二叉树,可以发现镜像二叉树实际上就是把每个节点的左右孩子结点进行了交换,比如在遍历到8这个节点时候,首先交换其左右孩子6和10,其对应的子树也应该进行交换。所以我们可以采用前序遍历的方法进行操作,每当遇到一个结点的时候,首先判断其是否有左右孩子(有其中之一即可),如果有的话,就交换其左右孩子,然后继续遍历其左右子树,只要不为空就继续交换其左右孩子节点(在交换具有孩子结点的结点的时候,其孩子结点也一并被交换了)。代码实现:
递归方式:public class Solution { public void Mirror(TreeNode root) { if(root == null|| root.left==null&&root.right==null) return; TreeNode tempNode = root.left; root.left = root.right; root.right = tempNode; if(root.left!=null) Mirror(root.left); if(root.right!=null) Mirror(root.right); } }
非递归方式:
/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ import java.util.Stack; public class Solution { public void Mirror(TreeNode root) { if (root == null || (root.left == null && root.right == null)) return; Stack<TreeNode> s = new Stack<TreeNode>(); s.push(root); while (!s.isEmpty()) { TreeNode node = s.pop(); //交换左右孩子结点 TreeNode nodeTemp = node.left; node.left = node.right; node.right = nodeTemp; //遍历左子树 if (node.left != null) s.push(node.left); //遍历右子树 if (node.right != null) s.push(node.right); } } }
相关文章推荐
- JavaScript中的基本数据类型和引用数据类型
- replace indexOf 正则表达式
- web框架学习前复习——html
- JS 代码编一个倒时器
- 【剑指offer】替换空格
- 在jsp中插入时间控件的使用方法
- [php学习十四]javaScript的基本练习4-对象
- 基于Ubuntu的无GPU的Caffe配置
- 自学前端小笔记
- 避免jQuery名字冲突--noConflict()方法
- jquery ajax 实例
- Leetcode Game of Life
- Caffe 深度学习框架上手教程
- JSF2标签库
- jquery遍历函数.li ???
- JQuery动画效果
- 基于bootstrap3的表格组件
- inode工作原理
- XML与HTML
- CSS 之 overflow