美文网首页
Binary Search Tree(二叉排序树)

Binary Search Tree(二叉排序树)

作者: c048e8b8e3d7 | 来源:发表于2017-05-11 21:01 被阅读17次
    示例

    特点

    BinarySearchTree(BST)是一种特殊的BinaryTree,其特点是
    1 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    2 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    3 左、右子树也分别为二叉排序树;

    向二叉排序树中插入值的步骤

    1 如果当前节点为空(只有没有根节点这种情况),则插入节点,结束
    2 如果插入值小于当前节点的值

    • 如果左子树不存在,则将插入值对应的节点设为当前节点的leftChild,结束
    • 如果左子树存在,则对左子树执行步骤123

    3 如果插入值大于当前节点的值

    • 如果右子树不存在,则将插入值对应的节点设为当前节点的rightChild,结束
    • 如果右子树存在,则对左子树执行步骤123

    示例

    代码创建的二叉排序树结构见文章顶部的示例图

    @interface BinarySortTree : NSObject
    
    @property(nonatomic, assign) NSInteger value;
    
    @property(nonatomic, assign, readonly) NSUInteger count;
    
    @property(nonatomic, strong) BinarySortTree *leftChild;
    
    @property(nonatomic, strong) BinarySortTree *rightChild;
    
    - (void)insertValue:(NSInteger)value;
    
    - (NSString *)traverseInOrder;
    
    - (NSString *)traversePreOrder;
    
    - (NSString *)traversePostOrder;
    
    - (BinarySortTree *)search:(NSInteger)value;
    
    
    @implementation BinarySortTree
    
    - (void)insertValue:(NSInteger)value
    {
        
        if (value <= 0) return;
        
        //当树没有一个节点的时候,把value当成根节点
        if (!self.leftChild && !self.rightChild && _value == 0) {
            _value = value;
            return;
        }
        
        if (value == _value) {
            return;
        }
        
        if (value < _value) {
            //leftChild
            if (_leftChild) {
                [_leftChild insertValue:value];
            } else {
                BinarySortTree *tree = [BinarySortTree new];
                tree.value = value;
                _leftChild = tree;
            }
        } else {
            //rightChild
            if (_rightChild) {
                [_rightChild insertValue:value];
            } else {
                BinarySortTree *tree = [BinarySortTree new];
                tree.value = value;
                _rightChild = tree;
            }
        }
    }
    
    - (NSUInteger)count
    {
        return [self.leftChild count] + (_value > 0 ? 1 : 0) + [self.rightChild count];
    }
    //遍历的时间复杂度为O(n),因为每一个节点都会被访问
    //顺序遍历,从小到大。先访问leftChild,然后访问当前节点,最后访问rightChild的顺序
    - (NSString *)traverseInOrder
    {
        if (_value == 0) {
            return @"";
        }
        
        return [NSString stringWithFormat:@"%@ %ld %@", [_leftChild traverseInOrder] ?: @"", _value, [_rightChild traverseInOrder] ?: @""];
    }
    
    //先访问节点,然后访问leftChild,最后访问rightChild的顺序
    - (NSString *)traversePreOrder
    {
        if (_value == 0) return @"";
        
        return [NSString stringWithFormat:@"%ld %@ %@",  _value, [_leftChild traversePreOrder] ?: @"", [_rightChild traversePreOrder] ?: @""];
    }
    
    //先访问leftChild,然后访问rightChild,最后访问当前节点的顺序
    - (NSString *)traversePostOrder
    {
        if (_value == 0) return @"";
        
        return [NSString stringWithFormat:@"%@ %@ %ld",  [_leftChild traversePostOrder] ?: @"", [_rightChild traversePostOrder] ?: @"" , _value];
    }
    
    //查找的平均时间复杂度为O(log n),因为每次查找的时候只会在一个子树中查找
    - (BinarySortTree *)search:(NSInteger)value
    {
        if (value <= 0) {
            return nil;
        }
        
        if (_value == value) {
            return self;
        } else if (value < _value) {
            return [self.leftChild search:value];
        } else {
            return [self.rightChild search:value];
        }
    }
    
    @end
    

    测试

    - (void)binarySortTreeTest
    {
        BinarySortTree *tree = [BinarySortTree new];
        
        [tree insertValue:7];
        [tree insertValue:10];
        [tree insertValue:2];
        [tree insertValue:1];
        [tree insertValue:5];
        [tree insertValue:9];
        
        NSLog(@"tree.count = %lu", (unsigned long)tree.count);
        NSLog(@"traverseInOrder=%@", [tree traverseInOrder]);
        NSLog(@"traversePreOrder=%@", [tree traversePreOrder]);
        NSLog(@"traversePostOrder=%@", [tree traversePostOrder]);
        
        BinarySortTree *b1 = [tree search:0];
        BinarySortTree *b2 = [tree search:1];
        BinarySortTree *b3 = [tree search:7];
    }
    

    参考链接

    参考1

    相关文章

      网友评论

          本文标题:Binary Search Tree(二叉排序树)

          本文链接:https://www.haomeiwen.com/subject/brxatxtx.html