两数之和。给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true

题目来源:https://leetcode-cn.com/problems/two-sum-iv-input-is-a-bst/

给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。

测试用例中的树按层遍历为[5,3,6,2,4,null,7]

测试用例表示为(包含多个测试用例):

[5,3,6,2,4,null,7]  9

[5,3,6,2,4,null,7]  28

[2,1,3]       4

[2,0,3,-4,1]    -1

二叉搜索树的性质:

  • 可以是一颗空树
  • 若存在左子树,则左子树所有节点的值都小于(是小于,不包括等于)根节点的值,若存在右子树,则根节点的值大于右子树所有节点的值

结合二叉搜索树的性质,我们可以想到,二叉搜索树的中序遍历是一个递增的有序数列

得出思路:

  1. 中序遍历二叉搜索树,得到一个数组,这里用Vector存放树节点值,因为不确定树节点的个数,否则使用数组更方便,设为v。
  2. 从v值查找和数,若找到返回true,找不到返回false(为方便,下面将向量v用数组的形式进行表示)

从v的最后一个值开始v[j](j=n-1),比较v[j]和target/2的大小,

1)若v[j]<target/2直接返回false(因为v[j]是最大的值,若v[j]小于target/2,在v的其他值一定小于target/2,肯定是没有两个数的和等于target。)

2)若v[j]>target/2则对比v[j]+v[i](i=0),

2.1)若v[j]+v[i]=target,返回true;

2.2)若v[j]+v[i]<target,则i++;

2.3)若v[j]+v[i]>target,则j--

java实现:

    public boolean findTarget(TreeNode root, int k) {
        Vector v = new Vector();
        traverse1(root,k,v);
        return find(v,k);
    }
    private void traverse(TreeNode root, int k, Vector v){
        if(root == null) return;
        if(root.left != null){
            traverse(root.left, k, v);
        }
        v.addElement(root.val);
        //System.out.print(root.val+"\t");

        if(root.right != null){
            traverse(root.right, k, v);
        }
    }

    private boolean find(Vector v, int k){
        int n = v.size();
        if(n > 0){
            for(int j = n-1; j>0; j--){
                if((int)v.get(j) > k/2){ // 2)
                    for(int i=0; i<j; i++){
                        int add = (int)v.get(j) + (int)v.get(i);
                        if(add == k){
                            return true;  // 2.1)
                        }else if(add > k){
                            break;   //2.3)
                        }
                    }
                }else{
                    return false;// 1)
                }
            }
        }
        return false;
    }

该算法的执行时间效率很高,但消耗的内存多,因为使用了vector存放数据(注意要在LeetCode上要import vector)。

要想在IDE(eclipse)中调试,请参考博客《如何在IDE(eclipse)中debug LeetCode的树算法

为了得到而努力

2019-04-05

转载请注明来处

原文地址:https://www.cnblogs.com/malw/p/10658203.html

时间: 2024-08-06 13:52:25

两数之和。给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true的相关文章

LeetCode 783. 二叉搜索树结点最小距离(Minimum Distance Between BST Nodes)

783. 二叉搜索树结点最小距离 LeetCode783. Minimum Distance Between BST Nodes 题目描述 给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值. 示例: 输入: root = [4,2,6,1,3,null,null] 输出: 1 解释: 注意: root 是树结点对象 (TreeNode object),而不是数组. 给定的树 [4,2,6,1,3,null,null] 可表示为下图: 4 / 2 6 / \ 1 3 最小的差

一步两步学算法之二叉搜索树

Binary Search Tree  又叫二叉查找树,二叉排序树 这是种什么样的树呢? 其实就是根节点的左子树比根节点小  右子树比根节点大  同时 左子树和右子树也是二叉搜索树 代码比较简单 基本用递归实现 比较好理解  只有删除带有左右子树的节点时比较难理解 方法就是 直接在右子树找一个最小的节点 取代要被删除的节点 再继续删除右子树里的节点 详细看代码 1 #include "stdio.h" 2 #include "stdlib.h" 3 typedef

【算法导论学习-24】二叉树专题2:二叉搜索树(Binary Search Tree,BST)

一.   二叉搜索树(Binary SearchTree,BST) 对应<算法导论>第12章.相比一般二叉树,BST满足唯一的条件:任意节点的key>左孩子的key,同时<右孩子的key. 1.     节点类: public class BinarySearchTreesNode<T> { private int key; private T satelliteData; private BinarySearchTreesNode<T> parent, l

二叉搜索树的删除操作详解(BST)

一.思想:分类讨论 二.二叉搜索树的删除操作具体讨论分如下四种情况:(记我们要删除的节点为D) 1.如果D节点既没有左孩子,也没有右孩子,那么直接删除就好了: 2.如果D节点只有左孩子,没有右孩子,那么只需要把该D节点左孩子链接到D节点的父亲节点,然后删除D节点就好了: 3.如果D节点只有右孩子,没有左孩子,那么只需要把该D节点右孩子链接到D节点的父亲节点,然后删除D节点就好了: 4.如果D节点既有左孩子,又有右孩子,那么需要找到D节点的右子树的最小值节点,找到之后直接替换掉D节点,然后删除找到

二叉搜索树的插入,删除,和中序遍历

构建一个值的类型为int的二叉搜索树,输入N和M,然后进行N次插入操作,每次插入之后进行一次遍历验证代码正确性.然后进行M次删除操作,每次删除之后进行一次遍历验证代码正确性. #include "bits/stdc++.h" using namespace std; typedef long long LL; const int INF = 0x3f3f3f3f; struct BST { int value; BST* lson; BST* rson; }* root; void r

【模板】二叉搜索树(二叉排序树,二叉查找树,BST)

二叉搜索树其实就是满足左结点小于根,右结点大于根这类规则的树形结构. 1 int n; 2 int a[MAX_N]; 3 int lt[MAX_N], rt[MAX_N]; 4 // 没有则为-1 5 // 默认a[0]为根结点 6 7 void Insert(int x, int obj) // 插入结点a[obj] 8 { 9 if(a[obj] < a[x]) 10 { 11 if(lt[x] ^ -1) Insert(lt[x], obj); 12 else lt[x] = obj;

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的&#160;key&#160;对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用

一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点: 如果找到了,删除它. 说明: 要求算法时间复杂度为 O(h),h 为树的高度. 示例: root = [5,3,6,2,4,null,7] key = 3 5 / 3 6 / \ 2 4 7 给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它. 一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示. 5 / 4 6 / 2 7 另一个正确答案是 [5,2,6,null,4,null,7]. 5

[CareerCup] 4.6 Find Next Node in a BST 寻找二叉搜索树中下一个节点

4.6 Write an algorithm to find the'next'node (i.e., in-order successor) of a given node in a binary search tree. You may assume that each node has a link to its parent.

C++ 查询一个序列是否可能是一个二叉搜索树的后序遍历

其中,最重要的是,sequence一开始如果它的值为空的话,它是要返回false.但是之后,只要sizex小于3都应该返回true class Solution {public: bool VerifySquenceOfBST(vector<int> sequence) { if (sequence.size() == 0) { return false; } return VerifySquenceOfBSTChild(sequence); } bool VerifySquenceOfBST