赞
踩
继续学习二叉树的知识,在解决这三个问题之前我们要先来理解下深度和高度的知识,这些是解决问题的基础。
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数
目录
本题利用递归三部曲来解决,在解决问题之前,我们要先确定遍历二叉树的方式,根节点的高度也就是最大深度,根据这个性质我们可以确定使用后续遍历的方式,因为后续遍历的顺序是左右中,我们在利用递归遍历完左子树和右子树后,把高度返回给中节点,中节点进行合并后返回给根节点,我们现在来确定三部曲的参数:
根据这三部我们可以写出代码:
- public int maxDepth(TreeNode root) {
- return getHeight(root);
- }
- int getHeight(TreeNode root){
- if(root==null){//确定终止条件
- return 0;
- }
- int left = getHeight(root.left); //左
- int right = getHeight(root.right); //右
- return Math.max(left,right)+1; //中
- }
这个题和上个题目很相似可以说非常相似,只需要我们取最小值,但是做这个题目我们要想到一个容易被忽略的点,也就是根节点左子树为空的时候返回的是0,我们需要排除这个情况,所以在进行返回中节点的时候需要判断一下。
这里我放下需要思考的代码:
- if(root.left==null&&root.right!=null){
- return right+1;
- }
- if(root.left!=null&&root.right==null){
- return left+1;
- }
下面是整体代码:
- public int minDepth(TreeNode root) {
- return getHeight(root);
- }
- int getHeight(TreeNode root){
- if(root==null){
- return 0;
- }
- int left = getHeight(root.left); //左
- int right = getHeight(root.right); //右
- int mid = Math.min(left,right); //中
- //需要特殊处理的地方--》也就是左或者右节点为空的情况
- if(root.left==null&&root.right!=null){
- return right+1;
- }
- if(root.left!=null&&root.right==null){
- return left+1;
- }
- return mid+1;
- }
本题当成普通二叉树来解决,会比较容易想到,我先来说下普通二叉树递归方法解决,再来说下完全二叉树的递归遍历。而这题我们依旧利用后序遍历来解决
int getNums(TreeNode root)
- if(root==null){
- return 0;
- }
- int left = getNums(root.left); //左
- int right = getNums(root.right); //右
- int mid = left+right+1; //中
- return mid;
最终代码:
- public int countNodes(TreeNode root) {
- return getNums(root);
- }
- int getNums(TreeNode root){
- if(root==null){
- return 0;
- }
- int left = getNums(root.left);
- int right = getNums(root.right);
- int mid = left+right+1;
- return mid;
- }
public int countNodes(TreeNode root)
- TreeNode left = root.left;
- TreeNode right = root.right;
- int leftDepth=0,rightDepth=0;
- while(left!=null){
- left=left.left;
- leftDepth++;
- }
- while(right!=null){
- right=right.right;
- rightDepth++;
- }
- if(leftDepth==rightDepth){
- return (2<<leftDepth)-1;
- }
- int leftNum=countNodes(root.left);
- int rightNum=countNodes(root.right);
- return leftNum+rightNum+1;
最终代码:
- public int countNodes(TreeNode root) {
- if(root==null){
- return 0;
- }
- TreeNode left = root.left;
- TreeNode right = root.right;
- int leftDepth=0,rightDepth=0;
- while(left!=null){
- left=left.left;
- leftDepth++;
- }
- while(right!=null){
- right=right.right;
- rightDepth++;
- }
- if(leftDepth==rightDepth){
- return (2<<leftDepth)-1;
- }
- int leftNum=countNodes(root.left);
- int rightNum=countNodes(root.right);
- return leftNum+rightNum+1;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。