find all pairs of elements in a balanced BST that sum to a certain number

平衡BST求和对查找
本文介绍了一种在平衡二叉搜索树(BST)中寻找元素对的方法,这些元素对的和等于给定数值。通过中序遍历确保节点递增顺序,并避免返回重复的元素对。
Given a  number. find all pairs of elements in a balanced bst, 

which sum to this number. Make sure you don't return same pair again



我的想法是先序遍历每个节点,然后在每个节点处调用查找函数

但是这有问题,给定数8, 之前查到的节点是1,7; 后来查到的节点是7,1


像这类题目,需要避免重复,就要考虑到顺序。

用中序遍历树,这样就可以保证节点从小到大递增,在查找时要判断是否小于given number/2


struct NODE 
{
        int nVal;
        NODE* pLft;
        NODE* pRgt;

        NODE(int n) : nVal(n), pLft(NULL), pRgt(NULL) {}
};

NODE* GetPair(int nSum, NODE* pRoot, NODE* pCur)
{
        assert(pRoot != NULL && pCur != NULL);
        if (nSum - pCur->nVal <= pCur->nVal) return NULL;

        NODE* pRes = pRoot;
        while (NULL != pRes)
        {
                if (pRes->nVal == nSum - pCur->nVal)
                        break;
                if (pRes->nVal < nSum - pCur->nVal)
                        pRes = pRes->pRgt;
                else
                        pRes = pRes->pLft;
        }

        return pRes;
}

void GetPairsToSum(int nSum, NODE* pRoot, NODE* pCur, vector<pair<NODE*, NODE*>>& vec)
{
        if (NULL == pCur || NULL == pRoot) return;

        GetPairsToSum(nSum, pRoot, pCur->pLft, vec);

        NODE* pRes = GetPair(nSum, pRoot, pCur);
        if (NULL != pRes)
                vec.push_back(make_pair(pCur, pRes));

        GetPairsToSum(nSum, pRoot, pCur->pRgt, vec);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值