深度优先搜索:从起始节点开始,沿着一条路径尽可能深地探索,直到无法继续,然后回溯到上一个节点,再选择另一条路径继续深入探索,以此类推,直到访问完所有可达节点。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return root;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
// 交换左右子树
TreeNode temp = node.left;
node.left = node.right;
node.right = temp;
if (node.right != null) stack.push(node.right);
if (node.left != null) stack.push(node.left);
}
return root;
}
}
递归实现深度优先搜索:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root ==null){
return root;
}
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
root.left = right;
root.right = left;
return root;
}
}
广度优先搜索:从起始节点开始,逐层地对节点进行访问,先访问起始节点的所有邻接节点,然后依次访问这些邻接节点的邻接节点,按照距离起始节点由近到远的顺序进行遍历。
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null){
return root;
}
Queue<TreeNode> quu = new LinkedList<>();
quu.offer(root);
while(!quu.isEmpty()){
//int size = queue.size(),因为只是翻转,不需要过于在意是哪一行
TreeNode node = quu.poll();
if(node.left != null) quu.offer(node.left);
if(node.right != null) quu.offer(node.right);
TreeNode temp = node.left;
node.left = node.right;
node.right = temp;
}
return root;
}
}