数据结构

单链表

实现了单链表的判空、计算长度、遍历、头部添加、尾部追加、中间插入、删除指定元素、搜寻元素的功能

class Node():
  '''创建节点元素'''
  def __init__(self,item):
    '''item为存的值,next为指针'''
    self.elem = item
    self.next = None
    
class SingleLinkList():
  def __init__(self,node=None):
    '''初始化节点,可传可不传参'''
    self.__head = node 
  '''
  思路:
  判断头节点是否为空,则整个链表就是否为空
  '''
  def is_empty(self):
    '''判断链表是否为空'''
    return self.__head is None
  '''
  思路:
  需要一个计数的count,还需要一个游标,
  游标不停的移动到下一个节点,根据节点是否为空来判断是否走完
  移动的过程中,保证count的数值和移动的步数一致
  '''
  def length(self):
    '''计算链表长度'''
    count = 0
    cur = self.__head
    while cur != None:
      count += 1
      cur = cur.next
    return count
  '''
  思路:
  一个游标,移动游标,每到一个节点打印该节点的元素值,根据节点是否为空来判断,是否遍历完
  '''
  def travel(self):
    '''遍历整个链表'''
    cur = self.__head
    while cur != None:
      print(cur.elem,end=" ")
      cur = cur.next
  '''
  思路:
  头部节点原先所指的节点给新节点的next,
  头部节点指向新节点
  '''
  def add(self,item):
    '''头部添加节点'''
    node = Node(item)   
  	node.next = self.__head
    self.__head = node
  '''
  思路:
  通过cur.next != None 找到尾部节点,然后将新节点赋值给它,
  因为使用的是.next来判断,所以需要注意链表为空的情况,
  追加判断链表为空,直接使用self.__head = node
  '''
  def append(self,item):
    '''尾部追加节点'''
    node = Node(item)
    if self.__head is None:
      self.__head = node
    else:
      cur = self.__head
      while cur.next != None:
        cur = cur.next
      cur.next = node
  '''
  思路:
  根据插入位置,分别插入头部尾部和中间任意位置
  因为插入时,主要是操作前面的节点,所以需要找到前面节点的位置
  根据判断num 标识和pos的大小,能正好找到前一个节点
  然后交换数据就行
  特殊情况时,已经包含了,空格链表的情况将自动由尾插法插入
  '''   
  def insert(self,pos,item):
    '''中间位置插入节点'''
    if pos<0:
      self.add(item)
    elif pos>self.length()-1:
      self.append(item)
    else:
    	num = 0
      pre = self.__head
      while num<pos:	
        pre = pre.next
        num += 1
      node = Node(item)
      node.next = pre.next
      pre.next = node
  '''
  思路:
  需要双指针,一个指针为找到指定元素节点的位置,另个指针为指定元素节点的前一个节点
  找到元素时:正好是头节点,需要直接将头节点赋予当前游标的next
  '''
  def remove(self,item):
    '''删除链表中的指定的元素'''
    cur = self.__head
    pre = None
    while cur != None:
      if cur.elem == item:
        if cur==self.__head:
          self.__head = cur.next
        else:
          pre.next = cur.next
        break
      else:
        pre = cur
        cur = cur.next
  '''
  思路:
  一个游标判断节点元素和传来的值是否相等
  '''
  def search(self,item):
    '''判断元素是否存在'''
    cur = self.__head
    while cur!=None:
      if cur.elem ==item:
        return True
      cur = cur.next
    else:
      return False

二叉树

class Node():
    def __init__(self,item):
        self.elem = item
        self.lchild = None
        self.rchild = None

class Tree():
    def __init__(self):
        self.root = None

    def add(self,item):
        node = Node(item)
        if self.root is None:
            self.root = node
            return
        queue = [self.root]
        while queue:
            cur_node = queue.pop(0)
            if cur_node.lchild is None:
                cur_node.lchild = node
                return
            else:
                queue.append(cur_node.lchild)
            if cur_node.rchild is None:
                cur_node.rchild = node
                return
            else:
                queue.append(cur_node.rchild)

    def breadth_travel(self):
      '''遍历'''
        if self.root is None:
            return
        queue = [self.root]
        while queue:
            cur_node = queue.pop(0)
            print(cur_node.elem)
            if cur_node.lchild is not None:
                queue.append(cur_node.lchild)
            if cur_node.rchild is not None:
                queue.append(cur_node.rchild)

    def preorder(self,node):
      '''先序遍历'''
        if node is None:
            return
        print(node.elem,end=" ")
        self.preorder(node.lchild)
        self.preorder(node.rchild)

    def inorder(self,node):
      '''中序遍历'''
        if node is None:
            return
        self.inorder(node.lchild)
        print(node.elem,end=" ")
        self.inorder(node.rchild)

    def outorder(self,node):
      '''后序遍历'''
        if node is None:
            return
        self.outorder(node.lchild)
        self.outorder(node.rchild)
        print(node.elem,end=" ")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值