一.题目
操作给定的二叉树,将其变换为源二叉树的镜像。
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);
}
}
}