zoukankan      html  css  js  c++  java
  • 数据结构 --- 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('
    ')

  • 相关阅读:
    error: expected unqualified-id extern "C" {
    cmake交叉编译android(转)
    wwindows文件放入linux后多出换行符
    JNI 引用问题梳理(转)
    OpenCV实现任意大小图片的合并(转)
    android camera preview常用格式
    Linux下找不到动态链接库(转)
    ld链接器的工作原理及链接顺序(转)
    添加静态库入动态库时,符号查找不到的问题
    如何捕获 System.loadLibrary 产生的异常?(转)
  • 原文地址:https://www.cnblogs.com/sc-1067178406/p/11028545.html
Copyright © 2011-2022 走看看