数据结构 --- 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(‘\n‘)
tree.mid(tree.root)
print(‘\n‘)
tree.back(tree.root)
print(‘\n‘)
结果为:

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(‘\n‘)
tree.mid(tree.root)
print(‘\n‘)
tree.back(tree.root)
print(‘\n‘)

原文地址:https://www.cnblogs.com/sc-1067178406/p/11028545.html

时间: 2024-08-26 08:11:45

数据结构 --- 03.查找, 二叉树的相关文章

数据结构与算法(c++)——查找二叉树与中序遍历

查找树ADT--查找二叉树 定义:对于树中的每个节点X,它的左子树中的所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项. 现在给出字段和方法定义(BinarySearchTree.h) #include <queue> class BinarySearchTree { private: struct Node { int value; Node* left; Node* right; }; Node* root; void insert(Node*, int); void trav

数据结构7_链二叉树

本文实现了二叉树了存储实现,起先决定和队列与栈一样,设计一个二叉树节点的类型class treeNode,再构建一个二叉树类处理节点的生成,遍历等,结果在做二叉树创建函数CreateBitTree时遇到了很多问题,最后才发现直接构建一个二叉树类型就可以了. 这里主要介绍利用先序序列和中序序列重构一个二叉树的函数 #include<iostream>#include<math.h>using namespace std;class BitTree{    char *data;   

查找二叉树

[问题描述] 已知一棵二叉树用邻接表结构存储,中序查找二叉树中值为x的结点,并指出是第几个结点.例:如图二叉树的数据文件的数据格式如下 7 15 5 2 3 12 4 5 10 0 0 29 0 0 15 6 7 8 0 0 23 0 0 •‘ 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 struct node 6 { 7 int parent;

SDUT 3343 数据结构实验之二叉树四:还原二叉树

数据结构实验之二叉树四:还原二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. Input 输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串. Output 输出一个整数,即该二叉树的

【数据结构】之二叉树的java实现

二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要. 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 这个定义是递归的.由于左.右子树也是二叉树, 因此子树也可为空树.下图中展现了五种不同基本形态的二叉树. 其中 (a) 为空树, (b

SDUT 3346 数据结构实验之二叉树七:叶子问题

数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点).请建立该二叉树并按从上到下从左到右的顺序输出该二叉树的所有叶子结点. Input 输入数据有多行,每一行是一个长度小于50个字符的字符串. Output 按从上到下从左到右的顺序输出二叉树的叶子结点. Example Inpu

SDUT 3342 数据结构实验之二叉树三:统计叶子数

数据结构实验之二叉树三:统计叶子数 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并求二叉树的叶子结点个数. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 输出二叉树的叶子结点个数. Example Input abc,,de,g,,f

SDUT 3340 数据结构实验之二叉树一:树的同构

数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. Input 输入数据包含

javascript实现数据结构:线索二叉树

遍历二叉树是按一定的规则将树中的结点排列成一个线性序列,即是对非线性结构的线性化操作.如何找到遍历过程中动态得到的每个结点的直接前驱和直接后继(第一个和最后一个除外)?如何保存这些信息? 设一棵二叉树有n个结点,则有n-1条边(指针连线) , 而n个结点共有2n个指针域(Lchild和Rchild) ,显然有n+1个空闲指针域未用.则可以利用这些空闲的指针域来存放结点的直接前驱和直接后继信息. 对结点的指针域做如下规定: 1.若结点有左子树,则其leftChild域指示其左孩子,否则令leftC