一、二叉树的层序遍历
力扣第102题:
(DFS)递归代码如下:
class Solution {
public List<List<Integer>> resList = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
DFSOrder(root, 0);
return resList;
}
public void DFSOrder(TreeNode node, int deep) {
if(node == null) return;
deep++;
if(resList.size() < deep) {
List<Integer> list = new ArrayList<>();
resList.add(list);
}
resList.get(deep-1).add(node.val);
Order(node.left, deep);
Order(node.right, deep);
}
}
(BFS)迭代代码如下:
class Solution {
public List<List<Integer>> resList = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
BFSOrder(root, 0);
return resList;
}
public void BFSOrder(TreeNode node, int deep) {
if(node == null) return;
Queue<TreeNode> que = new LinkedList<>();
que.offer(node);
while(!que.isEmpty()) {
List<Integer> list = new ArrayList<>();
int len = que.size();
while(len > 0) {
TreeNode tmpNode = que.poll();
list.add(tmpNode.val);
if(tmpNode.left != null) que.offer(tmpNode.left);
if(tmpNode.right != null) que.offer(tmpNode.right);
len--;
}
resList.add(list);
}
}
}
二、翻转二叉树
力扣第226题:
题目描述:
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例:
输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]
层序遍历:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return null;
Queue<TreeNode> que = new LinkedList<>();
que.offer(root);
while(!que.isEmpty()) {
TreeNode node = que.poll();
TreeNode temp = node.left;
node.left = node.right;
node.right = temp;
if(node.left != null) {
que.offer(node.left);
}
if(node.right != null) {
que.offer(node.right);
}
}
return root;
}
}
前序递归遍历:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return null;
swap(root);
invertTree(root.left);
invertTree(root.right);
return root;
}
public void swap(TreeNode root) {
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
}
前序迭代遍历:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return null;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()) {
TreeNode node = stack.pop();
swap(node);
if(node.right != null) stack.push(node.right);
if(node.left != null) stack.push(node.left);
}
return root;
}
public void swap(TreeNode root) {
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
}
统一迭代前序遍历:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return null;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()) {
TreeNode node = stack.pop();
if(node != null) {
if(node.right != null) stack.push(node.right);
if(node.left != null) stack.push(node.left);
stack.push(node);
stack.push(null);
}else {
node = stack.pop();
swap(node);
}
}
return root;
}
public void swap(TreeNode root) {
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
}
三、对称二叉树
力扣第101题:
题目描述:
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例:
输入:root = [1,2,2,3,4,4,3] 输出:true
后序递归代码如下:
class Solution {
public boolean isSymmetric(TreeNode root) {
return compare(root.left, root.right);
}
public boolean compare(TreeNode left, TreeNode right) {
// 首先排除空节点的情况
if (left == NULL && right != NULL) return false;
else if (left != NULL && right == NULL) return false;
else if (left == NULL && right == NULL) return true;
// 排除了空节点,再排除数值不相同的情况
else if (left->val != right->val) return false;
// 此时就是:左右节点都不为空,且数值相同的情况
// 此时才做递归,做下一层的判断
bool outside = compare(left->left, right->right); // 左子树:左、 右子树:右
bool inside = compare(left->right, right->left); // 左子树:右、 右子树:左
bool isSame = outside && inside; // 左子树:中、 右子树:中 (逻辑处理)
return isSame;
}
}