剑指 Offer II 056. 二叉搜索树中两个节点之和(653. 两数之和 IV - 输入二叉搜索树)
题目:



思路:
【1】思路1:对于树优先是遍历完全部,把数值拿出来(如中序遍历,形成数组后采用双指针就可以了判断了)。
【2】思路2:对于树优先是在遍历过程中,遍历的要存起来,且要判断差值是否已经存在了。
代码展示:
思路1的方式:
//时间2 ms击败95.45% //内存42 MB击败46.20% class Solution { List<Integer> list = new ArrayList<Integer>(); public boolean findTarget(TreeNode root, int k) { inorderTraversal(root); int left = 0, right = list.size() - 1; while (left < right) { if (list.get(left) + list.get(right) == k) { return true; } if (list.get(left) + list.get(right) < k) { left++; } else { right--; } } return false; } public void inorderTraversal(TreeNode node) { if (node == null) { return; } inorderTraversal(node.left); list.add(node.val); inorderTraversal(node.right); } }
思路2的方式(如层次遍历的方式,当然其他遍历的方式也可以,这种会比思路一要好,因为不一定要把树全部遍历完,或许遍历一部分就可以得到返回值了):
//时间3 ms击败43.11% //内存41.7 MB击败82.88% /** * 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 findTarget(TreeNode root, int k) { Set<Integer> set = new HashSet<Integer>(); Queue<TreeNode> queue = new ArrayDeque<TreeNode>(); queue.offer(root); while (!queue.isEmpty()) { TreeNode node = queue.poll(); if (set.contains(k - node.val)) { return true; } set.add(node.val); if (node.left != null) { queue.offer(node.left); } if (node.right != null) { queue.offer(node.right); } } return false; } }
或者递归遍历的方式:
//时间2 ms击败96.72% //内存41.6 MB击败94.1% //如这种递归遍历的方式也可以 class Solution { Set<Integer> set = new HashSet<Integer>(); public boolean findTarget(TreeNode root, int k) { if (root == null) { return false; } if (set.contains(k - root.val)) { return true; } set.add(root.val); return findTarget(root.left, k) || findTarget(root.right, k); } }

浙公网安备 33010602011771号