刷题笔记(二叉树)-04

Posted 康小庄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题笔记(二叉树)-04相关的知识,希望对你有一定的参考价值。

题目地址:993. 二叉树的堂兄弟节点 - 力扣(LeetCode) (leetcode-cn.com)

思路:

我们可以从根节点开始,对树进行一次遍历,在遍历的过程中维护「深度」以及「父节点」这两个信息。当我们遍历到 xx 或 yy 节点时,就将信息记录下来;当这两个节点都遍历完成了以后,我们就可以退出遍历的过程,判断它们是否为堂兄弟节点了。

  • 定义变量分别存储x和y的信息
  • 然后只需要在深度优先搜索的递归函数中增加表示「深度」以及「父节点」的两个参数即可。
class Solution {
    // x 的信息
    int x;
    TreeNode xParent;
    int xDepth;
    boolean xFound = false;

    // y 的信息
    int y;
    TreeNode yParent;
    int yDepth;
    boolean yFound = false;

    public boolean isCousins(TreeNode root, int x, int y) {
        this.x = x;
        this.y = y;
        dfs(root, 0, null);
        return xDepth == yDepth && xParent != yParent;
    }

    public void dfs(TreeNode node, int depth, TreeNode parent) {
        if (node == null) {
            return;
        }

        if (node.val == x) {
            xParent = parent;
            xDepth = depth;
            xFound = true;
        } else if (node.val == y) {
            yParent = parent;
            yDepth = depth;
            yFound = true;
        }

        // 如果两个节点都找到了,就可以提前退出遍历
        if (xFound && yFound) {
            return;
        }

        dfs(node.left, depth + 1, node);

        if (xFound && yFound) {
            return;
        }

        dfs(node.right, depth + 1, node);
    }
}

复杂度分析:

  • 时间复杂度:O(n)O(n),其中 nn 是树中的节点个数。在最坏情况下,我们需要遍历整棵树,时间复杂度为 O(n)O(n)。

  • 空间复杂度:O(n)O(n),即为深度优先搜索的过程中需要使用的栈空间。在最坏情况下,树呈现链状结构,递归的深度为 O(n)O(n)。

题目地址:101. 对称二叉树 - 力扣(LeetCode) (leetcode-cn.com)

)

摘自一位评论区大佬的评论,看完点醒了我

问题可以转化为:两个树在什么情况下互为镜像?

如果同时满足下面的条件,两个树互为镜像:

  • 它们的两个根结点具有相同的值
  • 每个树的右子树都与另一个树的左子树镜像对称

思路 递归法

  • 定义节点1 节点2

  • 先判断节点1和节点2是否为空,是空,肯定是对称的

  • 如果 节点1为null或节点2为null 或 节点1的值!=节点2的值,那必然是不对称

  • 调用递归,通过 同步移动两个指针方法,节点1和节点2指针 一开始都指向根节点,然后 节点1左移时,节点2右移,节点1右移,节点2左移,每次检查当前节点1和节点2的值 是否相等,相等再判断是否对称左右子树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null){
            return true;
        }
        return cmp(root.right,root.left);
    }
    public boolean cmp(TreeNode node1,TreeNode node2){
        if(node1==null&&node2==null){
            return true;
        }
        if(node1==null||node2==null||node1.val!=node2.val){
            return false;
        }
        return cmp(node1.left,node2.right) && cmp(node2.left,node1.right);
    }
}

复杂度分析

假设树上一共 nn 个节点。

  • 时间复杂度:这里遍历了这棵树,渐进时间复杂度为 O(n)O(n)。
  • 空间复杂度:这里的空间复杂度和递归使用的栈空间有关,这里递归层数不超过 nn,故渐进空间复杂度为 O(n)O(n)。

思路 迭代法

  • 定义个队列 先把根节点左右节点入队列
  • while循环 首先弹出两个节点 node1 node2
  • 判断 node1和node2是否空 二者一为空 继续
  • 如果 节点1为null或节点2为null 或 节点1的值!=节点2的值,那必然是不对称
  • 将两个结点的左右子结点按相反的顺序插入队列中
  • 队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null){
            return true;
        }
    

    LinkedList<TreeNode> queue=new LinkedList<TreeNode>();
    queue.offer(root.left);
    queue.offer(root.right);

    while(!queue.isEmpty()){
        TreeNode node1=queue.poll();
        TreeNode node2=queue.poll();
        if(node1==null&&node2==null){
            continue;
        }
        if(node1==null||node2==null||node1.val!=node2.val){
            return false;
        }
        queue.offer(node1.left);
        queue.offer(node2.right);
        queue.offer(node2.left);
        queue.offer(node1.right);
    }
    return true;
    }
}

复杂度分析

  • 时间复杂度:这里遍历了这棵树,渐进时间复杂度为 O(n)O(n)
  • 空间复杂度:这里需要用一个队列来维护节点,每个节点最多进队一次,出队一次,队列中最多不会超过 nn 个点,故渐进空间复杂度为 O(n)O(n)。

代码均由力扣编译器,提交通过,描述编写不当地方还请大家评论区指出!

以上是关于刷题笔记(二叉树)-04的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode Java刷题笔记— 111. 二叉树的最小深度

LeetCode Java刷题笔记— 111. 二叉树的最小深度

LeetCode刷题笔记-数据结构-day18

LeetCode刷题笔记-数据结构-day18

LeetCode刷题笔记-数据结构-day18

LeetCode Java刷题笔记—226. 翻转二叉树