目录
1.翻转二叉树
题目:
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]
示例 2:
输入:root = [2,1,3] 输出:[2,3,1]
解题思路:
使用前序或者后序遍历 二叉树,并且在遍历过程中 将每个节点的左右孩子互换
代码
public class Solution {
public TreeNode InvertTree(TreeNode root) {
if(root==null)//递归终止
return root;
swap(root);//互换左右节点
InvertTree(root.left);
InvertTree(root.right);
return root;
}
public void swap(TreeNode node)
{
TreeNode temp = node.left;
node.left = node.right;
node.right =temp;
}
}
力扣链接:
2.对称二叉树
题目
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3] 输出:true
解题思路:
要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。
比较的是两个子树的里侧和外侧的元素是否相等。如图所示:
本题遍历只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。
正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。
代码:
public class Solution {
public bool IsSymmetric(TreeNode root) {
if(root==null)
return true;
return compare(root.left,root.right);
}
public bool 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 outSame = compare(left.left,right.right);//比较外侧
bool inSame = compare(left.right,right.left);//比较内侧
bool isSame = outSame&&inSame;
return isSame;
}
}
力扣链接:
对称二叉树
3.二叉树最大深度
题目:
给定一个二叉树 root
,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:3
解题思路:
本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。
代码:
public class Solution {
public int MaxDepth(TreeNode root) {
return GetDepth(root);
}
public int GetDepth(TreeNode root)
{
if(root==null)//如果为空节点 返回0
return 0;
int left = GetDepth(root.left);//递归活得左子树的高度
int right = GetDepth(root.right);
int depth =1+Math.Max(left,right);
return depth;
}
}
力扣链接:
二叉树最大深度
4.二叉树最小深度
题目:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:2
解题思路:
本题依然是前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。
本题还有一个误区,在处理节点的过程中,最大深度很容易理解,最小深度就不那么好理解,如图:
这就重新审题了,题目中说的是:最小深度是从根节点到最近叶子节点的最短路径上的节点数量。注意是叶子节点。
什么是叶子节点,左右孩子都为空的节点才是叶子节点!
如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。
反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。 最后如果左右子树都不为空,返回左右子树深度最小值 + 1 。
代码:
public class Solution {
public int MinDepth(TreeNode root) {
return GetDepth(root);
}
public int GetDepth(TreeNode root)
{
if(root==null)
return 0;
int left = GetDepth(root.left);
int right = GetDepth(root.right);
if(root.left==null&&root.right!=null)
{
return 1+right;//左子树为空 高度为1+最小的右子树高度
}
else if(root.left!=null&&root.right==null)
{
return 1+left;//右子树为空 高度为1+最小的左子树高度
}
int depth = 1+Math.Min(left,right);
return depth;
}
}
力扣链接:
二叉树最小深度