题目:请完成一个函数,输入一棵二叉树,该函数输出它的镜像。
二叉树节点定义如下:
struct BinaryTreeNode
{
int value;
BinaryTreeNode* left;
BinaryTreeNode* right;
}
思路:
1.先前序遍历这棵树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点。
2.当交换完所有非叶节点的左、右子节点之后,就得到了树的镜像。
java参考代码如下:
package chapter4;
import java.util.ArrayDeque;
public class P151_MirrorOfBinaryTree {
public static class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val=val;
this.left=null;
this.right=null;
}
}
public static void mirrorRecursively(TreeNode root){
if(root==null) return;
if(root.left==null&&root.right==null) return;
TreeNode temp=root.left;//exchange left,right
root.left=root.right;
root.right=temp;
if(root.left!=null)
mirrorRecursively(root.left);
if(root.right!=null)
mirrorRecursively(root.right);
}
public static void printTree(TreeNode root){
if(root==null) return;
ArrayDeque<TreeNode> stack=new ArrayDeque<>();
System.out.print("[ ");
TreeNode p=root;
while (!stack.isEmpty()||p!=null){
if(p!=null){
System.out.print(p.val+" ");
stack.addFirst(p);
p=p.left;
}else {
TreeNode t=stack.pollFirst();
p=t.right;
}
}
System.out.print(" ]");
System.out.println();
}
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
root.right.left = new TreeNode(6);
root.right.right = new TreeNode(7);
mirrorRecursively(root);
printTree(root);
}
}
基于以上思路,参考代码如下:
void MirrorRecursively(BinaryTreeNode* pNode)
{
if(pNode == nullptr)
return;
if(pNode->left == nullptr && pNode->right == nullptr)
return;
BinaryTreeNode* pTemp = pNode->left;
pNode->left = pNode->right;
pNode->right = pTemp;
if(pNode->left)
MirrorRecursively(pNode->left);
if(pNode->right)
MirrorRecursively(pNode->right);
}
测试用例:
a.功能测试(普通的二叉树;二叉树的所有节点都没有左子树或者右子树;只有一个节点的二叉树)。
b.特殊输入测试(二叉树的根节点为nullptr指针)。