• 数据结构 --- 03.查找, 二叉树


    一.查找

      1.顺序查找(列表无序)

    顺序查找原理剖析:
      从列表中的第一个元素开始,我们按照基本的顺序排序,简单地从一个元素移动到另一个元素,
      直到找到我们正在寻找的元素或遍历完整个列表。如果我们遍历完整个列表,则说明正在搜索的元素不存在。
    def search(alist,item):
        find = False
        length = len(alist)
        
        for i in range(length):
            if alist[i] == item:
                find = True
                
        return find
    alist = [3,8,5,7,6,4]
    print(search(alist,51))


    #False

      2.顺序查找(列表有序)

    def search(alist,item):
        length = len(alist)
        find = False
        pos = 0
        stop = False
        while pos <= length and not stop:
            if alist[pos] == item:
                find = True
                break
            elif alist[pos] > item:
                stop = True
            else:
                pos += 1
        return find
    alist = [1,3,5,7,9,11]
    print(search(alist,5))

    #True

      3.二分查找(重要)

      有序列表对于我们的实现搜索是很有用的。在顺序查找中,当我们与第一个元素进行比较时,
    如果第一个元素不是我们要查找的,则最多还有 n-1 个元素需要进行比较。 二分查找则是
    从中间元素开始,而不是按顺序查找列表。 如果该元素是我们正在寻找的元素,我们就完成
    了查找。 如果它不是,我们可以使用列表的有序性质来消除剩余元素的一半。如果我们正在
    查找的元素大于中间元素,就可以消除中间元素以及比中间元素小的一半元素。如果该元素在
    列表中,肯定在大的那半部分。然后我们可以用大的半部分重复该过程,继续从中间元素开始,
    将其与我们正在寻找的内容进行比较
    def search(alist,item):
        last = len(alist)-1
        first = 0
        find = False
        
        while first<=last and not find:
            mid = (last+first) // 2
            if alist[mid] == item:
                find = True
            else:
                if alist[mid] > item:
                    last = mid - 1
                else:
                    first = mid + 1
        return find
    alist = [1,3,5,7,9]
    print(search(alist,31))

    # False

    二.二叉树

    二叉树
      - 跟节点
      - 左叶子节点
      - 右叶子节点
      - 子树
    二叉树遍历
      广度遍历:层级遍历
      深度遍历
        前序:根左右
        中序:左根右
        后序:左右根
    排序二叉树

      1.二叉树的创建及广度遍历

    class Node():
        def __init__(self,item):
            self.item = item
            self.left = None
            self.right = None
    class Tree():
        #构造方法可以构造一个空树
        def __init__(self):
            self.root = None
        def add(self,item):
            node = Node(item)
            #判断树为空
            if self.root == None:
                self.root = node
                return
            #树为非空的插入操作,创建一个可操作的列表
            queue = [self.root]
            
            while queue:
                cur = queue.pop(0)
                if cur.left == None:
                    cur.left = node
                    return
                else:
                    queue.append(cur.left)
                if cur.right == None:
                    cur.right = node
                    return
                else:
                    queue.append(cur.right)
        #广度遍历
        def travel(self):
            queue = [self.root]
            while queue:
                cur = queue.pop(0)
                print(cur.item)
                if cur.left is not None:
                    queue.append(cur.left)
                if cur.right is not None:
                    queue.append(cur.right)
    tree = Tree()
    tree.add(1)
    tree.add(2)
    tree.add(3)
    tree.add(4)
    tree.add(5)
    tree.add(6)
    tree.add(7)
    tree.add(8)
    tree.add(9)
    tree.add(10)
    tree.travel()

    # 1 2 3 4 5 6 7 8 9 10

      2.深度遍历

    class Node():
        def __init__(self,item):
            self.item = item
            self.left = None
            self.right = None
    class Tree():
        #构造方法可以构造一个空树
        def __init__(self):
            self.root = None
        def add(self,item):
            node = Node(item)
            #判断树为空
            if self.root == None:
                self.root = node
                return
            #树为非空的插入操作
            queue = [self.root]
            
            while queue:
                cur = queue.pop(0)
                if cur.left == None:
                    cur.left = node
                    return
                else:
                    queue.append(cur.left)
                if cur.right == None:
                    cur.right = node
                    return
                else:
                    queue.append(cur.right)
        #深度遍历
        def forward(self,root): #根左右
            if root == None:
                return
            print(root.item,end=' ')
            self.forward(root.left)
            self.forward(root.right)
            
        def mid(self,root):#左根右
            if root == None:
                return
            self.mid(root.left)
            print(root.item,end=' ')
            self.mid(root.right)
            
        def back(self,root):#左右根
            if root == None:
                return
            self.back(root.left)
            self.back(root.right)
            print(root.item,end=' ')
    tree = Tree()
    tree.add(1)
    tree.add(2)
    tree.add(3)
    tree.add(4)
    tree.add(5)
    tree.add(6)
    tree.add(7)
    tree.add(8)
    tree.add(9)
    tree.add(10)
    
    tree.forward(tree.root)
    print('
    ')
    tree.mid(tree.root)
    print('
    ')
    tree.back(tree.root)
    print('
    ')
    结果为:

    1
    2 4 8 9 5 10 3 6 7 8 4 9 2 10 5 1 6 3 7 8 9 4 10 5 2 6 7 3 1

      3.排序二叉树

    class Node():
        def __init__(self,item):
            self.item = item
            self.left = None
            self.right = None
    class Tree():
        #构造方法可以构造一个空树
        def __init__(self):
            self.root = None
        #需要根据一个准则将节点进行插入,准则:比根节点小的数据插入到左侧,比根节点大的数插入到右侧
        def insert(self,item):
            node = Node(item)
            if self.root == None:
                self.root = node
                return
            cur = self.root
            #右
            while True:
                if item > cur.item:
                    if cur.right == None:
                        cur.right = node
                        return
                    else:
                        cur = cur.right
    
                else:
                    if cur.left == None:
                        cur.left = node
                        return
                    else:
                        cur = cur.left
            
         #深度遍历
        def forward(self,root): #根左右
            if root == None:
                return
            print(root.item,end=' ')
            self.forward(root.left)
            self.forward(root.right)
            
        def mid(self,root):#左根右
            if root == None:
                return
            self.mid(root.left)
            print(root.item,end=' ')
            self.mid(root.right)
            
        def back(self,root):#左右根
            if root == None:
                return
            self.back(root.left)
            self.back(root.right)
            print(root.item,end=' ')
    tree = Tree()
    tree.insert(3)
    tree.insert(0)
    tree.insert(2)
    tree.insert(9)
    tree.insert(1)
    tree.insert(6)
    tree.insert(4)
    tree.forward(tree.root)
    print('
    ')
    tree.mid(tree.root)
    print('
    ')
    tree.back(tree.root)
    print('
    ')

  • 相关阅读:
    [树形dp] Luogu P4516 潜入行动
    [kruskal][Trie] Codeforces 888G Xor-MST
    [线性基] Luogu P4151 最大XOR和路径
    [线段树] Luogu P4560 砖墙
    [递归][重心] Luogu P4886 快递员
    [Trie][贪心][堆] LibreOJ #3048 异或粽子
    [长链剖分][优先队列] LibreOJ #3052 春节十二响
    [支配树] Bzoj P2815 灾难
    [长链剖分][线段树] Bzoj P1758 重建计划
    [dsu on tree] Codeforces 600E Lomsat gelral
  • 原文地址:https://www.cnblogs.com/sc-1067178406/p/11028545.html
Copyright © 2020-2023  润新知