赞
踩
哈喽大家好,这是我leetcode刷题的第七篇,这两天我将更新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:
输入: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,结束当前的递归,执行之前递归的内容。
右子树是同一个道理
/** * 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>类型,所以我们创建一个list 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; } }
二叉树的中序遍历跟二叉树的前序遍历思路是一样的,不同的只是遍历的顺序,中序遍历是先遍历左子树,然后是根节点,再就是右子树。
/** * 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; } }
二叉树的后序遍历是先遍历左子树,然后是右子树,最后是根节点
/** * 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; } }
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
输入: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); } }
给你两棵二叉树 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) { } }
输入: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,返回fasle if(root == null) { return false; } //判断root整个树是否跟subRoot相同 if(isSametree(root,subRoot)) { return true; } //判断左子树和右子树中是否含有subRoot return isSubtree(root.left,subRoot) || isSubtree(root.right,subRoot); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。