• 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:
     * 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
         */
        public SegmentTreeNode build(int start, int end) {
            // write your code here
            if(start> end)
                return null;
            SegmentTreeNode root = new SegmentTreeNode(start,end);
            if( start == end)
                return root;
            root.left = build(start , (start + end)/2);
            root.right = build((start + end)/2 + 1 , end);
            return root;
        }
    }
    Java Code
    """
    Definition of SegmentTreeNode:
    class SegmentTreeNode:
        def __init__(self, start, end):
            self.start, self.end = start, end
            self.left, self.right = None, None
    """
    
    class Solution:    
        # @param start, end: Denote an segment / interval
        # @return: The root of Segment Tree
        def build(self, start, end):
            # write your code here
            if start > end:
                return None
            root = SegmentTreeNode(start,end)
            if start == end:
                return root
            root.left = self.build(start,( start + end)/2)
            root.right = self.build(( start + end)/2  + 1,end)
            
            return root 
    Python Code


  • 相关阅读:
    CLR
    Cocos2dx 3.12 在AndroidStudio上编译配置
    MFC 调试方法
    列表初始化
    类型转换
    Cocos2d-x 3.4在AndroidStudio上编译配置
    出发 Let's Go
    LumiSoft.Net邮件接收乱码问题解决
    百度地图经纬度转换JS版
    百度经纬度和google经纬度互转
  • 原文地址:https://www.cnblogs.com/bbbblog/p/5284762.html
Copyright © 2020-2023  润新知