[LintCode]Segment Tree Build 构造线段树

线段树是一种二叉树结构,每个节点包含start和end属性,表示一个区间。通过build方法指定根节点的start和end,然后根据规则分配子节点的区间。当start等于end时,节点没有子节点。实现build方法,输入start和end,构建正确的线段树,并返回根节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

The structure of Segment Tree is a binary tree which each node has two attributes start and end denote an segment / interval.
start and end are both integers, they should be assigned in following rules:
The root’s start and end is given by build method.
The left child of node A has start=A.left, end=(A.left + A.right) / 2.
The right child of node A has start=(A.left + A.right) / 2 + 1, end=A.right.
if start equals to end, there will be no children for this node.
Implement a build method with two parameters start and end, so that we can create a corresponding segment tree with every node has the correct start and end value, return the root of this segment tree.

Example
Given start=0, end=3. The segment tree will be:

           [0,  3]
         /        \
  [0,  1]           [2, 3]
  /     \           /     \
[0, 0]  [1, 1]     [2, 2]  [3, 3]

Given start=1, end=6. The segment tree will be:

           [1,  6]
         /        \
  [1,  3]           [4,  6]
  /     \           /     \
[1, 2]  [3,3]     [4, 5]   [6,6]
/    \           /     \
[1,1][2,2]     [4,4]   [5,5]

Clarification
Segment Tree (a.k.a Interval Tree) is an advanced data structure which can support queries like:
which of these intervals contain a given point
which of these points are in a given interval
See wiki: Segment Tree Interval Tree

/**
 * Definition of SegmentTreeNode:
 * public class SegmentTreeNode {
 *     public int start, end;
 *     public SegmentTreeNode left, right;
 *     public SegmentTreeNode(int start, int end) {
 *         this.start = start, this.end = end;
 *         this.left = this.right = null;
 *     }
 * }
 */
public class Solution {
    /**
     *@param start, end: Denote an segment / interval
     *@return: The root of Segment Tree
     */
//BFS
    public SegmentTreeNode build(int start, int end) {
        if(start > end) return null;
        SegmentTreeNode root = new SegmentTreeNode(start, end);
        Queue<SegmentTreeNode> queue = new LinkedList<SegmentTreeNode>();
        if(start < end) {
            queue.add(root);
        }
        while(!queue.isEmpty()) {
            SegmentTreeNode node = queue.poll();
            int start1 = node.start;
            int end1 = (node.start + node.end)/2;
            int start2 = end1 + 1;
            int end2 = node.end;
            node.left = new SegmentTreeNode(start1, end1);
            node.right = new SegmentTreeNode(start2, end2);
            if(start1 != end1) {
                queue.add(node.left);
            }
            if(start2 != end2) {
                queue.add(node.right);
            }
        }
        return root;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值