小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
leetcode653-两数之和
前文
本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。
题目信息
给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
输入: root = [5,3,6,2,4,null,7], k = 9
输出: true
输入: root = [5,3,6,2,4,null,7], k = 28
输出: false
输入: root = [2,1,3], k = 4
输出: true
输入: root = [2,1,3], k = 1
输出: false
解题思路分析
解法1
本解法是从二叉树各节点的数值出发,对于二叉树进行中序遍历。同时额外利用map进行数据的存储。当遍历到每个节点时,判断map中是否已经存储了该节点。如果已经存储了则表示存在对应节点满足需求,两数和为目标和。如果不存在,则用目标值减当前节点值,将结果存储map中。然后再继续对剩余节点进行遍历。如果遍历完整个二叉树都没有得到目标节点则为不存在。反之,在遍历途中遇到存在的情况则为存在,可结束递归遍历,直接返回存在的结果。
HashMap<Integer,Integer> map = new HashMap<>();
public boolean findTarget(TreeNode root, int k) {
return spreadTree(root,k);
}
public boolean spreadTree(TreeNode node,int k){
if(node == null){
return false;
}
if(spreadTree(node.left,k)){
return true;
}
if(map.containsKey(node.val)){
return true;
}else{
map.put(k-node.val,1);
}
if(spreadTree(node.right,k)){
return true;
}
return false;
}
复杂度分析
- 时间复杂度:o(n)
- 空间复杂度:o(n)
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。