学习目标:
本次内容包括如下:
1.树的深度计算
2.判断是否为对称二叉树
1.计算树的深度:
问题的提出:
给定一个二叉树,找出其最大深度,二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
问题分析:
1)可以使用层序遍历法,在遍历的基础上,计算层数即可,层数就是最大深度
2)运用递归实现,自下而上的计算树的深度,叶结点的深度为1,然后向上+1
递归代码如下:
private static int maxDepth(TreeNode root){
if (root == null)
return 0;
int left_depth = maxDepth(root.left);
int right_depth = maxDepth(root.right);
return Math.max(left_depth, right_depth) + 1;
}
//运行结果
3
迭代实现与层次遍历法相同,不做赘述。
2.判断是否为对称二叉树:
问题描述:
给定一个二叉树,检查它是否是镜像对称的。
问题分析:
判断是否为对称二叉树,看不同侧的左树的左孩子与右树的右孩子val是否相等,以及左树的右孩子和右树的左孩子,同时若一个没有左右结点,而一个有左右结点则不是对称二叉树。
代码如下:
private static boolean isSymmetric(TreeNode root){
if (root == null)
return true;
return isSymmetricHelper(root.left, root.right);
}
private static boolean isSymmetricHelper(TreeNode left, TreeNode right){
if (left == null && right == null)
return true;
if (left == null || right == null ||left.val != right.val)
return false;
return isSymmetricHelper(left.left, right.right) && isSymmetricHelper(left.right, right.left);
}
迭代的实现步骤与上述递归相似,主要是注意入栈的顺序,实现如下:
private static boolean isSymmetric01(TreeNode root){
if (root == null)
return true;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root.left);
queue.add(root.right);
while (!queue.isEmpty()){
TreeNode left = queue.poll(); //先入的左树,先出左树
TreeNode right = queue.poll(); //右树出队
if (left == null && right == null) //若为空,跳出本次循环
continue;
if (left == null ^ right == null) //一个为空,一个不为空,不对称
return false;
if (left.val != right.val) //左右的值不同,也不是对称二叉树
return false;
//迭代的关键在于下述的代码,左左,右右同时入队,因为他俩是需要进行比较
//同时,左右,右左再入队,因为他俩是需要进行比较的,注意于上面的出队呼应
queue.add(left.left);
queue.add(right.right);
queue.add(left.right);
queue.add(right.left);
}
return true;
}