操作给定的二叉树,将其变换为源二叉树的镜像
问题描述
将给定的原二叉树变换为镜像二叉树
例:
思路
方法一:
观察上图发现:镜像二叉树就是把根节点的左子树和右子树互换,因此我们只要将该二叉树从根节点依次遍历即可。此时可以按照构造二叉树的思想,使用递归。
代码如下
//将原二叉树变为镜像二叉树
public void Mirror(TreeNode root) {
if(root == null)
return;
if(root.left == null && root.right == null)
return;
//将左子树和右子树互换
TreeNode p = root;
TreeNode tem = new TreeNode(0);
tem = p.left;
p.left = p.right;
p.right = tem;
//递归遍历左子树
if(p.left != null)
Mirror(p.left);
if(p.right != null)//递归遍历右子树
Mirror(p.right);
}
方法二
分析上面的代码,使用递归,其实就是为了保存已经交换过左右子树的节点,然后一直递归,直到该节点无孩子节点,然后向上回滚,释放上一个节点,进入该节点的相反子树(之前是该节点的左子树现在进入右子树,反之亦然),继续递归。
由此,我们可以用一个容器来保存已经交换过左右子树的节点,然后再重新从顶部取出最近放入的节点,所有我们可以用栈(后进先出)来保存节点。
由于笔者eclipse里没有写好的栈及其相关方法,而且又比较懒,所以我就用List来代替栈了。。。。。
----------------------------------------------我是分割线----------------------------------------------------------
那时不知道jdk源实现了栈结构,,,,太菜了-_-
代码如下
//利用栈的后进先出特性实现--》 循环实现
public void MirrorRound(TreeNode root){
if(root == null)
return;
if(root.left == null && root.right == null)
return;
List<TreeNode> list = new ArrayList<>();
list.add(root);
TreeNode p = null;
TreeNode tem = null;
while(list.size()>0){
p = list.remove(list.size()-1);
tem = p.left;
p.left = p.right;
p.right = tem;
if(p.left != null)
list.add(p.left);
if(p.right != null)
list.add(p.right);
}
}
记录一下在牛客刷题的经历。
谢谢观看。。。