课程
哈喽大家好,这是我leetcode刷题的第七篇,这两天我将更新leetcode上关于二叉树方面的题目,如果大家对这方面感兴趣的话,欢迎大家持续关注,谢谢大家。
那么我们就进入今天的主题。
文章目录
1.二叉树的前序遍历
题目要求
给你二叉树的根节点 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.二叉树的中序遍历
做题思路
二叉树的中序遍历跟二叉树的前序遍历思路是一样的,不同的只是遍历的顺序,中序遍历是先遍历左子树,然后是根节点,再就是右子树。
代码实现
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.二叉树的后序遍历
做题思路
二叉树的后序遍历是先遍历左子树,然后是右子树,最后是根节点
代码实现
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.相同的树
题目要求
给你两棵二叉树的根节点 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.另一颗树的子树
题目要求
给你两棵二叉树 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