题目:请完成一个函数,输入一棵二叉树,该函数输出它的镜像。
思路:可以使用递归和非递归(循环)的形式写代码。
递归代码,原文链接:https://blog.csdn.net/hh_zheng/article/details/78742895
递归代码的主要思想是先前序遍历这棵树的每一个节点,如果遍历到的节点有子节点,就交换它的两个节点。当交换完所有非叶子结点的左右节点之后,就得到了树的镜像。
非递归代码的主要思想好像也是用前序遍历,这个不太确定。使用了栈来实现。
代码:
递归代码:
public static void mirrorTree(TreeNode root){
//递归结束条件
if(root==null)
return;
if(root.left==null&&root.right==null) //找到叶子节点
return;
//必须先交换上层节点的左右子树
TreeNode temp=root.left;
root.left=root.right;
root.right=temp;
//递归翻转左右子树
if(root.left!=null){
mirrorTree(root.left);
}
if(root.right!=null){
mirrorTree(root.right);
}
}
非递归代码:
public void Mirror(TreeNode root) {
if (root == null) {
return;
}
Stack<TreeNode> stack = new Stack<>();
while (root != null || !stack.isEmpty()) {
while (root != null) {
TreeNode temp = root.left; //交换位置
root.left = root.right;
root.right = temp;
stack.push(root); //从根节点开始先一直检查到最左边的节点
root = root.left;
}
if (!stack.isEmpty()) { //将左节点都处理完后,从栈中取出节点处理右节点
root = stack.pop();
root = root.right;
}
}
}