1.二叉搜索树中的搜索
//给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。 // // 例如, // // //给定二叉搜索树: // // 4 // / \ // 2 7 // / \ // 1 3 // //和值: 2 // // // 你应该返回如下子树: // // // 2 // / \ // 1 3 // // // 在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。 // Related Topics 树
既然是二叉搜索树,我们可以直接确定到达我们需要查找的值的精准路径,因为我们在每一个分叉的时候都能确定是往左走还是往右走,这样就能确保在较短的时间内搜索到我们想要的值。
public TreeNode searchBST(TreeNode root, int val) {
if (root == null || val == root.val) return root;
return val < root.val ? searchBST(root.left, val) : searchBST(root.right, val);
}
2.叶子相似的树
//请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。 // 3 3 // / \ / \ // 5 1 5 1 // / \ / \ / \ / \ // 6 2 9 8 6 7 4 2 // / \ / \ // 7 4 9 8 // 举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。 // // 如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。 // // 如果给定的两个头结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。 // // // // 示例 1: // // // // 输入:root1 = [3,5,1,6,2,9,8,null,null,7,4], root2 = [3,5,1,6,7,4,2,null,null,nu //ll,null,null,null,9,8] //输出:true // // // 示例 2: // // 输入:root1 = [1], root2 = [1] //输出:true // // // 示例 3: // // 输入:root1 = [1], root2 = [2] //输出:false // // // 示例 4: // // 输入:root1 = [1,2], root2 = [2,2] //输出:true // // // 示例 5: // // // // 输入:root1 = [1,2,3], root2 = [1,3,2] //输出:false // // // // // 提示: // // // 给定的两棵树可能会有 1 到 200 个结点。 // 给定的两棵树上的值介于 0 到 200 之间。 // // Related Topics 树 深度优先搜索
直接将所有叶子节点的值都读出来然后放在列表里,对比两个列表是否相等即可。
class Solution {
public boolean leafSimilar(TreeNode root1, TreeNode root2) {
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
helper(root1, list1);
helper(root2, list2);
return list1.equals(list2);
}
private void helper(TreeNode node, List leafList){
if(node != null){
if(node.left == null && node.right == null){
leafList.add(node.val);
}
helper(node.left, leafList);
helper(node.right, leafList);
}
}
}