题目描述:
操作给定的二叉树,将其变换为源二叉树的镜像。
二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5
解:
由题目可以知道,就是将二叉树每一个左右子树的相对元素进行位置转换,可以递归的交换左右子树的元素,知道交换到叶子节点为止。非递归做法也是可以的,可以借助栈等作为中间存储元素的容器进行操作。代码如下:
递归做法:
public void Mirror(TreeNode root) {
if(root == null)
return;
if(root.left == null && root.right == null)
return;
TreeNode tempNode;
tempNode = root.left;
root.left = root.right;
root.right = tempNode;
if(root.left != null)
Mirror(root.left);
if(root.right != null)
Mirror(root.right);
}
借助栈:
public void Mirror(TreeNode root) {
if(root == null)
return;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
if(node.left != null || node.right != null){
TreeNode tempNode = node.right;
node.right = node.left;
node.left = tempNode;
}
if(node.left != null)
stack.push(node.left);
if(node.right != null)
stack.push(node.right);
}
}
借助队列:
public void Mirror(TreeNode root) {
if(root == null)
return;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.push(root);
while(!queue.isEmpty()){
TreeNode node = queue.pop();
if(node.left != null || node.right != null){
TreeNode tempNode = node.right;
node.right = node.left;
node.left = tempNode;
}
if(node.left != null)
queue.push(node.left);
if(node.right != null)
queue.push(node.right);
}
}