数据结构每日一练【二叉树的基础面试题】
1.二叉树的前序遍历
题目链接
题目:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
代码:
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list =new ArrayList<>();
if(root == null){
return list;
}
list.add(root.val);
System.out.print(root.val+" ");
list.addAll(preorderTraversal(root.left));
list.addAll(preorderTraversal(root.right));
return list;
}
}
运行结果:
输入测试用例:[1,null,2,3]
输出结果:[1,2,3]
add() 和 addAll()的区别:
- list.add():使用list.add()添加元素时,无论你添加的是什么类型数据,即使是另一个list集合,也只会增加一个元素;
- list.addAll():使用list.addAll()添加元素时,假如添加的是一个集合list3(2,7,8),则会把这个集合中的元素2,7,8都作为list集合的一个元素添加到list中;
2. 二叉树中序遍历
题目链接
题目:给定一个二叉树的根节点 root ,返回它的 中序 遍历。
代码:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list =new ArrayList<>();
if(root == null){
return list;
}
list.addAll(inorderTraversal(root.left));
list.add(root.val);
System.out.print(root.val+" ");
list.addAll(inorderTraversal(root.right));
return list;
}
}
运行结果:
输入:[1,null,2,3]
输出:[1,3,2]
3.二叉树的后序遍历
题目链接
题目:给定一个二叉树,返回它的 后序 遍历
代码:
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list =new ArrayList<>();
if(root == null){
return list;
}
list.addAll(postorderTraversal(root.left));
list.addAll(postorderTraversal(root.right));
list.add(root.val);
return list;
}
}
运行结果:
输入:[1,null,2,3]
输出:[3,2,1]
4.检查两颗树是否相同
题目链接
题目:给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
代码:
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p == null && q == null){
return true;
}
if(p != null && q == null || p == null && q != null ){
return false;
}
if(p.val != q.val){
return false;
}
return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
}
}
运行结果:
输入
[1,2,3]
[1,2,3]
输出:true
5.另一颗树的子树
题目链接
题目:给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false
代码:
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p == null && q == null){
return true;
}
if(p != null && q == null || p == null && q != null ){
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;
}
if(isSubtree(root.left,subRoot)){
return true;
}
if(isSubtree(root.right,subRoot)){
return true;
}
return false;
}
}
6.二叉树最大深度
题目链接
题目:给定一个二叉树,找出其最大深度
代码:
class Solution {
public int maxDepth(TreeNode root) {
//如果是空树,深度为0
if(root == null){
return 0;
}
//定义两个变量分别计算根节点左边,和右边的深度
int maxLeft = maxDepth(root.left);
int maxRight = maxDepth(root.right);
if(maxLeft>maxRight){
return maxLeft+1;
}else{
return maxRight+1;
}
}
}
7.判断平衡二叉树
题目链接
题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1
代码:
class Solution {
public int maxDepth(TreeNode root) {
if(root == null){
return 0;
}
int maxLeft = maxDepth(root.left);
int maxRight = maxDepth(root.right);
if(maxLeft>maxRight){
return maxLeft+1;
}else{
return maxRight+1;
}
}
public boolean isBalanced(TreeNode root) {
if(root == null){return true;}
int depthL = maxDepth(root.left);
int depthR = maxDepth(root.right);
return Math.abs(depthL-depthR)<=1 && isBalanced(root.left) && isBalanced(root.right);
}
}
8.对称二叉树
题目链接
题目:给定一个二叉树,检查它是否是镜像对称的。
代码:
class Solution {
public boolean isSametree(TreeNode p,TreeNode q) {
//p是root的左节点,q是root的右节点
if(p == null&& q==null){
return true;
}
//只要有一边为空,就不对称
if(p != null && q == null || p == null && q != null){
return false;
}
//对应的值不相等,也不对称
if(p.val != q.val){
return false;
}
return isSametree(p.left,q.right) && isSametree(p.right,q.left);
}
public boolean isSymmetric(TreeNode root) {
if(root == null){
return true;
}
return isSametree(root.left,root.right);
}
}