这个题目是对每个节点的左右子节点进行交换,实质上就是如何遍历树的所有节点,正好复习一遍树的遍历。
树的结构
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/ 解法一、递归后序遍历
public class Solution {
public TreeNode Mirror (TreeNode root) {
if (root == null) return null;
TreeNode left = Mirror(root.left);
TreeNode right = Mirror(root.right);
root.left = right;
root.right = left;
return root;
}
} 解法二、层序BFS遍历
import java.util.*;
public class Solution {
public TreeNode Mirror (TreeNode root) {
if (root == null) return null;
Queue<treenode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
processNode(node);
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
return root;
}
private void processNode(TreeNode node) {
TreeNode tmp = node.left;
node.left = node.right;
node.right = tmp;
}
} 解法三、先序非递归
import java.util.*;
public class Solution {
public TreeNode Mirror(TreeNode root) {
if (root == null)
return null;
Stack<treenode> stack = new Stack<>();
stack.push(root);
while (!stack.empty()) {
TreeNode node = stack.pop();
processNode(node);
if (node.left != null)
stack.push(node.left);
if (node.right != null)
stack.push(node.right);
}
return root;
}
private void processNode(TreeNode node) {
TreeNode tmp = node.left;
node.left = node.right;
node.right = tmp;
}
} 解法四、中序非递归
import java.util.*;
public class Solution {
public TreeNode Mirror(TreeNode root) {
if (root == null)
return null;
Stack<treenode> stack = new Stack<>();
TreeNode node = root;
while (node != null || !stack.isEmpty()) {
while (node != null) {
stack.push(node);
node = node.left;
}
if (!stack.isEmpty()) {
node = stack.pop();
processNode(node);
// 注意这里以前是node.right,因为上面已经交换了,所以这里要改为node.left
node = node.left;
}
}
return root;
}
private void processNode(TreeNode node) {
TreeNode tmp = node.left;
node.left = node.right;
node.right = tmp;
}
} 解法五、后序非递归
import java.util.*;
public class Solution {
public TreeNode Mirror(TreeNode root) {
if (root == null)
return null;
Stack<treenode> stack1 = new Stack<>();
Stack<treenode> stack2 = new Stack<>();
TreeNode node = root;
stack1.push(node);
while (!stack1.isEmpty()) {
node = stack1.pop();
stack2.push(node);
if (node.left != null)
stack1.push(node.left);
if (node.right != null)
stack1.push(node.right);
}
while (!stack2.isEmpty()) {
node = stack2.pop();
processNode(node); // 实现对每个节点子节点的交换
}
return root;
}
private void processNode(TreeNode node) {
TreeNode tmp = node.left;
node.left = node.right;
node.right = tmp;
}
} 
京公网安备 11010502036488号