(精华)2020年8月28日 数据结构与算法解析(树查找)

举报
愚公搬代码 发表于 2021/10/18 23:40:33 2021/10/18
【摘要】 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: 若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;左、右子树也分别为...

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

  • 若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
  • 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
  • 左、右子树也分别为二叉排序树。

二叉树查找需要先生成一个二叉排序树,再遍历所有节点逐一比较其值与关键字是否相同,相同则返回;若一直找不到,则返回-1。

示例:

public class BSTNode {
 
    public int Key { get; set; }
 
    public int Index { get; set; }
 
    public BSTNode Left { get; set; }
 
    public BSTNode Right { get; set; }
 
    public BSTNode(int key, int index) {
        Key = key;
        Index = index;
    }
 
    public void Insert(int key, int index) {
        var tree = new BSTNode(key, index);
        if (tree.Key <= Key) {
            if (Left == null) {
                Left = tree;
            }
            else {
                Left.Insert(key, index);
            }
        }
        else {
            if (Right == null) {
                Right = tree;
            }
            else {
                Right.Insert(key, index);
            }
        }
    }
 
    public int Search(int key) {
        //找左子节点
        var left = Left?.Search(key);
        if (left.HasValue && left.Value != -1) return left.Value;
        //找当前节点
        if (Key == key) return Index;
        //找右子节点
        var right = Right?.Search(key);
        if (right.HasValue && right.Value != -1) return right.Value;
        //找不到时返回-1
        return -1;
    }
 
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
public class Program {
 
    public static void Main(string[] args) {
        int[] array = { 43, 69, 11, 72, 28, 21, 56, 80, 48, 94, 32, 8 };
 
        Console.WriteLine(BinaryTreeSearch(array));
 
        Console.ReadKey();
    }
 
    public static int BinaryTreeSearch(int[] array) {
        var bstNode = new BSTNode(array[0], 0);
        for (int i = 1; i < array.Length; i++) {
            bstNode.Insert(array[i], i);
        }
        return bstNode.Search(80);
    }
 
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在最坏的情况下二叉树查找的时间复杂度为:O(n) ,在平均情况下的时间复杂度为: O(logn) 。

文章来源: codeboy.blog.csdn.net,作者:愚公搬代码,版权归原作者所有,如需转载,请联系作者。

原文链接:codeboy.blog.csdn.net/article/details/108278385

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。