zoukankan      html  css  js  c++  java
  • Lintcode---线段树的构造

    线段树是一棵二叉树,他的每个节点包含了两个额外的属性startend用于表示该节点所代表的区间。start和end都是整数,并按照如下的方式赋值:

    • 根节点的 start 和 end 由 build 方法所给出。
    • 对于节点 A 的左儿子,有 start=A.left, end=(A.left + A.right) / 2
    • 对于节点 A 的右儿子,有 start=(A.left + A.right) / 2 + 1, end=A.right
    • 如果 start 等于 end, 那么该节点是叶子节点,不再有左右儿子。

    实现一个 build 方法,接受 start 和 end 作为参数, 然后构造一个代表区间 [start, end] 的线段树,返回这棵线段树的根。

    说明

    线段树(又称区间树), 是一种高级数据结构,他可以支持这样的一些操作:

    • 查找给定的点包含在了哪些区间内
    • 查找给定的区间包含了哪些点

    见百科:
    线段树
    区间树

    样例

    比如给定start=1, end=6,对应的线段树为:

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



    思路:建立线段树,也是遵循树的特性,采用递归的方法建树;
       
        首先明确基准情形,然后,利用线段树的性质,递归建树!


    /**
     * Definition of SegmentTreeNode:
     * class SegmentTreeNode {
     * public:
     *     int start, end;
     *     SegmentTreeNode *left, *right;
     *     SegmentTreeNode(int start, int end) {
     *         this->start = start, this->end = end;
     *         this->left = this->right = NULL;
     *     }
     * }
     */
    class Solution {
    public:
        /**
         *@param start, end: Denote an segment / interval
         *@return: The root of Segment Tree
         */
        /*
        思路:建立线段树,也是遵循树的特性,采用递归的方法建树;
        
        首先明确基准情形,然后,利用线段树的性质,递归建树!
        */
        SegmentTreeNode * build(int start, int end) {
            // write your code here
            if(start>end){
                return NULL;
            }
            
            SegmentTreeNode* pHead=new SegmentTreeNode(start,end);
            if (start==end){
                return pHead;
            }
            
            int mid=start+(end-start)/2;
            pHead->left=build(start,mid);
            pHead->right=build(mid+1,end);
            
            return pHead;
        }
    };
    
     
  • 相关阅读:
    【leetcode】Basic Calculator III
    【leetcode】Reorganize String
    【leetcode】Largest Plus Sign
    【leetcode】Reach a Number
    【leetcode】Network Delay Time
    【leetcode】Monotone Increasing Digits
    【leetcode】Submission Details
    【leetcode】Valid Parenthesis String
    【leetcode】Max Area of Island
    New Concept English three(14)
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/7085883.html
Copyright © 2011-2022 走看看