Leetcode-对称二叉树&&二叉树的深度&&路径总和


以下为TreeNode的结构

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

一: 对称二叉树

递归实现

首先确定其特点,是关于根节点对称的,从根节点开始,根节点的左右子节点是对称的,从第二层开始,该节点的左孩子节点与兄弟节点的右孩子节点对称,右孩子节点与兄弟节点的左孩子节点对称,下面可以通过上面这个规律对节点进行控制进行递归对比
在这里插入图片描述在这里插入图片描述
首先明确递归结束条件:
(1)到达树的最后一层。
(2)遇到不符合条件,即不对称的情况直接结束递归。(1:一个节点为空,一个节点不为空。2:它们的值不同)

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null)
            return true;
        
        return recursive(root.left,root.right);
    }

    public boolean recursive(TreeNode root_left,TreeNode root_right){
        if(root_left==null&&root_right==null)//到达最后一层结束递归,并且都为空,返回真
            return true;
        if(root_left==null||root_right==null||root_left.val!=root_right.val)//(1:一个节点为空,一个节点不为空。2:它们的值不同)
            return false;
        return recursive(root_left.left,root_right.right)&&recursive(root_left.right,root_right.left);//该节点的左孩子节点与兄弟节点的右孩子节点对称,右孩子节点与兄弟节点的左孩子节点对称,不断递归
        
    }
}

迭代实现

按照规律对递归用队列稍加改造就可以写出来,原理一样,只不过,根节点需要入2次队,进行预处理,后面入队的顺序要控制好~左节点需要跟右节点在一起入队,另外当到达最后一层时,应该是continue而不是像递归一样直接return了

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null)
            return true;
        Queue<TreeNode>queue=new LinkedList<>();
        queue.add(root);
        queue.add(root);
        while(!queue.isEmpty()){
            TreeNode node1=queue.remove();
            TreeNode node2=queue.remove();
            if(node1==null&&node2==null)
                continue;
            if(node1==null||node2==null||node1.val!=node2.val)
                return false;
            queue.add(node1.left);
            queue.add(node2.right);
            queue.add(node1.right);
            queue.add(node2.left);
        }
        return true;
    
    }
}

二:二叉树深度

采用自底向上的思路进行求解,先递归到最下面的叶子节点,然后向上求解,每2个子节点向上的时候取最大值,在此基础上加上此根节点(加1),不断递归向上最后到达根部,得出结果
在这里插入图片描述

class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null)
            return 0;
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        return Math.max(left,right)+1;

    }
}

三:路径总和

在这里插入图片描述
这个题目的意思就是找到一条路径它的和等于22,是从根节点到叶子结点才算一条路径
在这里解说一下标准递归解答的吧,首先递归得明确结束条件
(1)考虑特殊情况,根节点为空,直接结束递归
(2)找到符合情况的路径,结束递归
(3)当到了叶子节点,结束递归
然后分左,右子树分别递归

class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
           if(root==null)//结束条件(1)的特殊情况
           		return false;
           	sum-=root.val;//不为空,则进行处理,减去当前节点的值,为下面继续递归进行处理
           	if(root.left==null&&root.right==null)//当到了叶子结点,2个节点都为空时,进行判断,否则继续递归,其中一个为空时,下次递归开头会进行判断
           		return sum==0;
           	return hasPathSum(root.left,sum)||hasPathSum(root.right,sum);//只要其中一个为真则返回真
           
    }
}
发布了57 篇原创文章 · 获赞 5 · 访问量 2794

猜你喜欢

转载自blog.csdn.net/qq_43520913/article/details/105678540
今日推荐