> 文章列表 > leetcode刷题(7)二叉树(1)

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

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

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

文章目录

  • 1.二叉树的前序遍历
    • 题目要求
    • 示例
    • 做题思路
    • 代码实现
  • 2.二叉树的中序遍历
    • 做题思路
    • 代码实现
  • 3.二叉树的后序遍历
    • 做题思路
    • 代码实现
  • 4.相同的树
    • 题目要求
    • 示例
    • 做题思路
    • 代码实现
  • 5.另一颗树的子树
    • 题目要求
    • 示例
    • 做题思路
    • 代码实现

1.二叉树的前序遍历

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

题目要求

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

/* 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 List<Integer> preorderTraversal(TreeNode root) {
}

示例

示例 1:
leetcode刷题(7)二叉树(1)

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

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

示例 3:

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

示例 4:
leetcode刷题(7)二叉树(1)

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

示例 5:
leetcode刷题(7)二叉树(1)

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

做题思路

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

leetcode刷题(7)二叉树(1)
list.add(root.val)
leetcode刷题(7)二叉树(1)

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

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

leetcode刷题(7)二叉树(1)
root为null时,返回null,结束当前的递归,执行之前递归的内容。
leetcode刷题(7)二叉树(1)
leetcode刷题(7)二叉树(1)
leetcode刷题(7)二叉树(1)
leetcode刷题(7)二叉树(1)leetcode刷题(7)二叉树(1)

右子树是同一个道理
leetcode刷题(7)二叉树(1)

代码实现

/* 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 List<Integer> preorderTraversal(TreeNode root) {//因为题目要求我们返回List<Integer>类型,所以我们创建一个listList<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;}
}

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

2.二叉树的中序遍历

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

做题思路

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

代码实现

/* 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 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;}
}

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

3.二叉树的后序遍历

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

做题思路

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

代码实现

/* 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 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;}
}

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

4.相同的树

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

题目要求

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

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

示例

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

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

/* 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 isSameTree(TreeNode p, TreeNode q) {
}

做题思路

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

代码实现

/* 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 isSameTree(TreeNode p, TreeNode q) {//当q或者p其中有一个为null时,我们就需要判断两个树的结构是否相同if(p == null || q == null) {//都为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);}
}

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

5.另一颗树的子树

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

题目要求

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

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

/* 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 isSubtree(TreeNode root, TreeNode subRoot) {}
}

示例

leetcode刷题(7)二叉树(1)
输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true

做题思路

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

代码实现

/* 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 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) {//当root遍历到空时说明root的左子树或者右子树中没有subRoot,返回fasleif(root == null) {return false;}//判断root整个树是否跟subRoot相同if(isSametree(root,subRoot)) {return true;}//判断左子树和右子树中是否含有subRootreturn isSubtree(root.left,subRoot) || isSubtree(root.right,subRoot);}
}

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