leetcode刷题(7)二叉树(1)

课程
哈喽大家好,这是我leetcode刷题的第七篇,这两天我将更新leetcode上关于二叉树方面的题目,如果大家对这方面感兴趣的话,欢迎大家持续关注,谢谢大家。
那么我们就进入今天的主题。

文章目录

1.二叉树的前序遍历

leetcode之二叉树的前序遍历(难度:简单)

题目要求

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。


class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
}

示例

示例 1:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NIWwbwe5-1689066315191)(https://i0.wp.com/img-blog.csdnimg.cn/c504bd3097864384b0cde1b8e8171065.png)]

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:
输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

输入:root = [1,2]
输出:[1,2]

示例 5:

输入:root = [1,null,2]
输出:[1,2]

; 做题思路

二叉树的遍历分为前序遍历、中序遍历和后序遍历,前序遍历是指先遍历根,在遍历左子树,最后遍历右子树。做二叉树相关的题目比较简单的思路一般就是使用递归,同样这题我们也使用递归来遍历二叉树。


list.add(root.val)




root为null时,返回null,结束当前的递归,执行之前递归的内容。



右子树是同一个道理

代码实现


class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {

        List<Integer> list = new ArrayList<>();

        if(root == null) {
            return list;
        }

        list.add(root.val);

        List<Integer> leftTree = preorderTraversal(root.left);
        list.addAll(leftTree);

        List<Integer> rightTree = preorderTraversal(root.right);
        list.addAll(rightTree);

        return list;
    }
}

2.二叉树的中序遍历

leetcode之二叉树的中序遍历(难度:简单)

做题思路

二叉树的中序遍历跟二叉树的前序遍历思路是一样的,不同的只是遍历的顺序,中序遍历是先遍历左子树,然后是根节点,再就是右子树。

代码实现


class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null) {
            return list;
        }
        List<Integer> leftTree = inorderTraversal(root.left);
        list.addAll(leftTree);
        list.add(root.val);
        List<Integer> rightTree = inorderTraversal(root.right);
        list.addAll(rightTree);

        return list;
    }
}

3.二叉树的后序遍历

leetcode之二叉树的后序遍历(难度:简单)

做题思路

二叉树的后序遍历是先遍历左子树,然后是右子树,最后是根节点

代码实现


class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null) {
            return list;
        }
        List<Integer> leftTree = postorderTraversal(root.left);
        list.addAll(leftTree);
        List<Integer> rightTree = postorderTraversal(root.right);
        list.addAll(rightTree);
        list.add(root.val);

        return list;
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BNfbCoTn-1689066315207)(https://i0.wp.com/img-blog.csdnimg.cn/1454d28dbecf4eb99c46f50485a6eb8f.png)]

4.相同的树

leetcode之相同的树(难度:简单)

题目要求

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例

输入:p = [1,2,3], q = [1,2,3]
输出:true


class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
}

做题思路

这个题我们可以先判断两个树的结构是否相同,如果结构相同我们就判断对应位置的数据是否相同,我们判断的顺序是先判断根节点,然后是左子树,再是右子树。

代码实现


class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {

        if(p == null || q == null) {

            if(p == null && q == null) {
                return true;
            }else {
                return false;
            }
        }

        if(p.val != q.val) {
            return false;
        }
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
    }
}

5.另一颗树的子树

leetcode之另一棵树的子树(难度:简单)

题目要求

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。


class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {

    }
}

示例


输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true

; 做题思路

我们做这个题需要用到前面的判断两个树是否相等,我们判断root是否有跟subRoot这个树相同的子树。

代码实现


class Solution {
    public boolean isSametree(TreeNode p,TreeNode q) {

        if(p == null || q == null) {
            if(p == null && q == null) {
                return true;
            }else {
                return false;
            }
        }
        if(p.val != q.val) {
            return false;
        }
        return isSametree(p.left,q.left) && isSametree(p.right,q.right);
    }

    public boolean isSubtree(TreeNode root, TreeNode subRoot) {

        if(root == null) {
            return false;
        }

        if(isSametree(root,subRoot)) {
            return true;
        }

        return isSubtree(root.left,subRoot) || isSubtree(root.right,subRoot);
    }
}

原文链接:https://blog.csdn.net/m0_73888323/article/details/130232063

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值