1.题目描述
操作给定的二叉树,将其变换为源二叉树的镜像
2.来源
3.编吧
3.1递归解法
这道二叉树镜像问题显然使用递归思想比较简单;
递归结束的条件为:当前结点为null;
3.2非递归
使用“栈”思想;
步骤如下:以上述二叉树为例:
(1)当前结点“8”;“8”出栈;交换“8”的左右子树;
当前结点“8”的左右子树不为空,即结点“6”,“10”入栈;
当前二叉树:
当前栈:
(2)当前结点为“6”;“6”出栈;交换“6”的左右子树;
当前结点“6”的左右子树不为空,即结点“7”,“5”入栈;
当前二叉树:
当前栈:
(3)当前结点“5”出栈;左右子树为空;无操作;
当前栈:
(4)当前结点“7”出栈;左右子树为空;无操作;
当前栈:
(5)当前结点为“10”,”10“出栈;交换结点“10”的左右子树;
当前结点“10”的左右子树不为空,即结点“11”,“9”入栈;
当前二叉树:
当前栈:
(6)当前结点”9“出栈;左右子树为空,无操作;
当前栈:
(7)当前结点“11”出栈,左右子树为空,无操作;
当前栈:空栈
4.CodeShow
4.1递归
public class Solution {
public void Mirror(TreeNode root) {
if(root == null){
return;
}
//交换左右子树,递归
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
Mirror(root.left);
Mirror(root.right);
}
}
4.2非递归
pulic class Solution{
public void Mirror(TreeNode root) {
//栈
if(root == null) return;
Stack<TreeNode> stack = new Stack<TreeNode>();//用来遍历的栈
TreeNode currentNode = null;
stack.push(root);
while(!stack.isEmpty()){
currentNode = stack.peek();//当前结点为栈顶元素
stack.pop();
swap(currentNode.left,currentNode.right);//交换当前结点的左右子树
if(currentNode.left != null) stack.push(currentNode.left);//交换后的左子树不为空,压入栈
if(currentNode.right != null) stack.push(currentNode.right);//交换后的右子树不为空,压入栈
}
}
//交换
public void swap(TreeNode p,TreeNode q){
TreeNode temp = p;
p = q;
q = temp;
}
}