会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132358个问题

node_list = [
    {'data':'A','left':'B','right':'C','is_root':True},
    {'data':'B','left':'D','right':'E','is_root':False},
    {'data':'D','left':'None','right':'None','is_root':False},
    {'data':'E','left':'H','right':'None','is_root':False},
    {'data':'H','left':'None','right':'None','is_root':False},
    {'data':'C','left':'F','right':'G','is_root':False},
    {'data':'F','left':'None','right':'None','is_root':False},
    {'data':'G','left':'I','right':'J','is_root':False},
    {'data':'I','left':'None','right':'None','is_root':False},
    {'data':'J','left':'None','right':'None','is_root':False}
]
class Node:
    def __init__(self,data,left=None,right=None):
        self.data,self.right,self.left = data,right,left

class Tree:
    def __init__(self,root=None):
        self.root = root
    def init_data(self,datas):
        node_dict = {}
        for d in datas:
            node = Node(d['data'],d['left'],d['right'])
            node_dict[d['data']] = node
        for d in datas:
            node = node_dict[d['data']]
            if node.left:
                node.left = node_dict[node.left]
            if node.right:
                node.right = node_dict[node.right]
            if d['is_root']:
                self.root= node
    def iter_node1(self,node):
        if node:
            print(node.data)
            self.iter_node1(node.left)
            self.iter_node1(node.right)
    def iter_node2(self,node):
        node_list = [node]
        for n in node_list:
            print(n.data)
            if n.left:
                node_list.append(n.left)
            if n.right:
                node_list.append(n.right)
    def reverse(self,node):
        if node:
            node.left,node.right = node.right,node.left
            self.reverse(node.left)
            self.reverse(node.right)

if __name__ == '__main__':
    tree = Tree()
    tree.init_data(node_list)
    tree.reverse(tree.root)
    # tree.iter_node1(tree.root)
    tree.iter_node2(tree.root)

image.png

老师,错在哪里?没看出来

Python 全系列/第十六阶段:数据结构与算法/算法与数据结构(旧) 61楼
Python 全系列/第十六阶段:数据结构与算法/算法与数据结构(旧) 62楼
Python 全系列/第十六阶段:数据结构与算法/算法与数据结构(旧) 64楼

后边试着加了几个删除的方法,指点一波,其中有一块不太确定,代码中写了

class Node():
    def __init__(self, value=None, next=None):
        self.value = value
        self.next = next

class Linklist():
    def __init__(self):
        self.root = Node()
        self.size = 0
        self.next = None

    def append(self,value):
        node = Node(value)
        if not self.next:
            self.root.next = node
        else:
            self.next.next = node
        self.size += 1
        self.next = node

    def append_first(self,value):
        '''
        最初
        root -> 1
        我理解的:
        2 -> root -> 1 (2为新增元素)
        如果是这样的话  可代码表示的就不一样了
        代码:
        root -> 2 -> 1
        很久没看书了,忘记了这一块的根节点用法了,是不是所谓的根节点root就是一个空,一个指针?
        '''
        node = Node(value)
        if not self.root.next:
            self.root.next = node
        else:
            tmp = self.root.next
            self.root.next = node
            node.next = tmp
        self.size += 1

    def remove_first(self):
        if not self.root.next:
            print('no node in link')
            pass
        else:
            '''
            最初:
            root -> 蔡文姬 -> 扁鹊 —> 阿珂
            删除头节点:
            root  -> 扁鹊 —> 阿珂
            '''
            self.root.next = self.root.next.next
            self.size -= 1


    def remove(self):
        '''
        从最后删除
        '''
        if not self.root.next:
            print('remove no node in link')
            pass
        else:
            current = self.root
            while current.next is not self.next:
                current = current.next
            self.next = current
            self.next.next = None
            self.size -= 1

    def remove_value(self,value):
        '''
        删除指定元素
        '''
        if not self.root.next:
            print('remove_value no node in link')
            pass
        else:
            if self.next.value == value:
                self.remove()
            elif self.root.next.value == value:
                self.remove_first()
            else:
                current = self.root.next
                while current.next.value != value:
                    current = current.next
                current.next = current.next.next
                self.size -= 1



    def remove_size(self,key):
        '''
        删除指定位置
        :param key: an int
        '''
        if key > self.size:
            print('size not enough')
        elif key == 1:
            self.remove_first()
        elif key == self.size:
            self.remove()
        else:
            '''
            感觉这一块不太对,但又不知道怎么搞
            '''
            current = self.root
            current_num = 1
            while current_num != key:
                current = current.next
                current_num += 1
            current.next = current.next.next
            self.size -= 1

    def __iter__(self):
        if not self.root.next:
            print('no node in link')
            pass
        else:
            current = self.root.next
            while current is not self.next:
                yield current.value
                current = current.next
            yield current.value


if __name__ == '__main__':
    link = Linklist()
    link.append('阿珂')
    link.append_first('扁鹊')
    link.append_first('蔡文姬')
    # link.remove_first()
    # link.remove_first()
    # link.remove()
    # link.remove_value('蔡文姬')
    link.remove_size(2)

    for v in link:
        print(v)


Python 全系列/第十六阶段:数据结构与算法/算法与数据结构(旧) 65楼

问题在代码里了

'''
建立单链表,并进行添加元素
'''

class Node():
    def __init__(self, value=None, next=None):
        self.value = value
        self.next = next

class Linklist():
    def __init__(self):
        self.root = Node()
        self.size = 0
        self.next = None

    def append(self,value):
        node = Node(value)
        if not self.next:
            self.root.next = node
        else:
            self.next.next = node
        self.size += 1
        self.next = node

    def append_first(self,value):
        '''
        最初
        root -> 1
        我理解的:
        2 -> root -> 1 (2为新增元素)
        如果是这样的话  可代码表示的就不一样了
        代码:
        root -> 2 -> 1
        很久没看书了,忘记了这一块的根节点用法了,是不是所谓的根节点root就是一个空,一个指针?
        '''
        node = Node(value)
        if not self.root.next:
            self.root.next = node
        else:
            tmp = self.root.next
            self.root.next = node
            node.next = tmp
        self.size += 1

    def __iter__(self):
        current = self.root.next
        while current is not self.next:
            yield current.value
            current = current.next
        yield current.value


if __name__ == '__main__':
    link = Linklist()
    link.append('阿珂')
    link.append_first('扁鹊')
    link.append_first('蔡文姬')

    for v in link:
        print(v)


Python 全系列/第十六阶段:数据结构与算法/算法与数据结构(旧) 66楼
Python 全系列/第十六阶段:数据结构与算法/算法与数据结构(旧) 68楼

# 数据结构:哈希表,使用二次探查方法解决哈希冲突的问题

# 先创建数组
class Array(object):
    def __init__(self,size=5):
        self._size = size # 存储数量
        self._item = [None]*size # 数组空间大小
        self._length = 0

    # 设置值
    def __setitem__(self, key, value):
        self._item[key]=value
        self._length += 1
    # 获取值
    def __getitem__(self, key):
        return self._item[key]

    # 定义长度单位
    def __len__(self):
        return self._length

    # 定义迭代特性
    def __iter__(self):
        for v in self._item:
            yield v

    def delitem(self,key):
        if self._item[key]:
            self._item[key]=None
        else:
            print('本身无数据')

# 创建存储到哈希表的对象类型
class Solt():
    # 初始化方法
    def __init__(self,key=None,value=None):
        self.key = key
        self.value = value
    # 打印对象
    def __str__(self):
        return f'key : {self.key},value : {self.value}'

# 创建哈希表数据结构,此方法存在哈希冲突
class HashTable():
    # 初始化方法 生成固定长度的哈希表
    def __init__(self):
        self.size = 4
        self.item = Array(self.size)

    # 获取哈希索引的方法
    def get_index(self,key):
        return hash(key) % self.size

    # 插入数据时查找哈希地址是否被占用,返回为空的地址索引
    def find_indexToPut(self,key):
        # 获取输入的key对应的索引值
        index = self.get_index(key)
        if self.item[index] == None:
            return index
        else:
            # 循环判断索引对应的对象的分支
            while self.item[index] is not None:
                if self.item[index].key == key:
                    return index
                else:
                    index = (5 * index + 1) % self.size
            return index

    # 放入哈希表数据
    def put(self,key,value):
        s = Solt(key,value)
        index = self.find_indexToPut(key)
        self.item[index] = s

    # 获取哈希表数据时,先判断索引对应位置存储的对象
    def find_index(self,key):
        index = self.get_index(key)
        # 循环判断索引对应的对象的分支
        if self.item[index] == None:
            return None
        else:
            # 循环判断索引对应的对象的分支
            while self.item[index] is not None:
                if self.item[index].key == key:
                    return index
                else:
                    index = (5 * index + 1) % self.size
            return None

    # 获取哈希表数据
    def get(self,key):
        # 判断获取的index
        index = self.find_index(key)
        return self.item[index]



if __name__ == '__main__':
    ht = HashTable()
    ht.put('name','我的老伙计')
    ht.put('sex', '男')
    ht.put('age', 18)
    ht.put('work', '程序员')
    ht.put('name', '北京')  # 超出哈希表的容量,陷入死循环了
    # ht.put('money', 1000)
    print(ht.get('name'))
    print(ht.get('sex'))
    print(ht.get('age'))
    print(ht.get('work'))
    # print(ht.get('home'))


Python 全系列/第十六阶段:数据结构与算法/算法与数据结构(旧) 69楼
Python 全系列/第十六阶段:数据结构与算法/算法与数据结构(旧) 70楼

class Node():
    """
    树结构
    """
    def __init__(self, datas, left, right):
        self.datas,self.left, self.right = datas, left, right

class Tree():
    def __init__(self, root = None):
        self.root = root
    def init_data(self, datas):
        node_dict = {}

        # 封装树节点
        for d in datas:
            node = Node(d['data'], d['left'], d['right'])
            node_dict[d['data']] = node
        # 根据节点关系 填充数据 
        for d in datas:
            node = node_dict[d['data']]
            if node.left:
                node.left = node_dict[node.left]
            if node.right:
                node.right = node_dict[node.right]
            if d['is_root']:
                self.root = node

    def search(self, subtree, value):
        if subtree is None:
            return None
        elif subtree.data > value:
            return self.search(subtree.left, value)
        elif subtree.data < value:
            return self.search(subtree.right, value)
        else:
            return subtree

if __name__ == '__main__':
    node_list = [
    {'data': 60, 'left': 12, 'right': 90, 'is_root': True},
    {'data': 12, 'left': 4, 'right': 41, 'is_root': False},
    {'data': 4, 'left': 1, 'right': None, 'is_root': False},
    {'data': 1, 'left': None, 'right': None, 'is_root': False},
    {'data': 41, 'left': 29, 'right': None, 'is_root': False},
    {'data': 29, 'left': 23, 'right': 37, 'is_root': False},
    {'data': 23, 'left': None, 'right': None, 'is_root': False},
    {'data': 37, 'left': None, 'right': None, 'is_root': False},
    {'data': 90, 'left': 71, 'right': 100, 'is_root': False},
    {'data': 71, 'left': None, 'right': 84, 'is_root': False},
    {'data': 100, 'left': None, 'right': None, 'is_root': False},
    {'data': 84, 'left': None, 'right': None, 'is_root': False},
]


    tree = Tree()
    tree.init_data(node_list)

    print(tree.search(tree.root, 41).data)
    # print(tree.search(tree.root, 55))

image.png

老师,请您帮忙看看是哪里错了,查了半天没找见

Python 全系列/第十六阶段:数据结构与算法/算法与数据结构(旧) 71楼

class Node():
    def __init__(self, prev = None, next = None, value = None):
        self.value = value
        self.prev = prev
        self.next = next
    def __str__(self):
        return f'Node:{self.value}'

class DoubleLinkList():
    def __init__(self):
        self.root = Node()  # 初始化root节点
        self.end = None  # 最后一个节点
        self.size = 0  # 链式结构的长度

    def append(self, value):
        node = Node(value)  # 实例化node  封装节点对象
        # 判断是否含有元素
        if not self.end:  # 如果没有数据
            self.root.next = node  # 将root的下一个节点设置为新的node节点
            node.prev = self.root  # 设置新的节点的 上一个节点为root节点
        else:
            self.end.next = node  # 将原来最后一个节点的下一个节点设置为 node节点
            node.prev = self.end  # 设置新节点的上一个节点为原来的最后一个节点 
        self.end = node   # 更新最后一个节点为新加的 node节点
        self.size += 1  # 更新链式结构大小

    def append_first(self, value):
        node = Node(value)
        if not self.end:
            self.end = node
        else:
            temp = self.root.next
            node.next = temp
            temp.prev = node
        node.prev = self.root  # 将node的前一个节点设置为根节点        
        self.root.next = node  # 将root的下一个节点设置为新的node节点
        self.size += 1  # 更新链式结构大小
    def __iter__(self):
        current = self.root.next
        if current:
            while current is not self.end:
                yield current.value
                current = current.next
            yield current.value

    def revers_iter(self):
        current = self.end  # 获取最后一个节点
        if current:
            while current is not self.root:
                yield current
                current = current.prev





if __name__ == '__main__':
    dlink = DoubleLinkList()
    dlink.append('孙悟空')
    dlink.append('唐僧')
    dlink.append('猪八戒')
    dlink.append('孙悟空')

    for i in dlink:
        print(i)
    print('------逆向遍历----')
    for i in dlink.revers_iter():
        print(i)

错误:

image.png

老师,我检查了好几遍也没找出来是哪里出错了 为什么显示的都是None?

Python 全系列/第十六阶段:数据结构与算法/算法与数据结构(旧) 73楼

class Node():
    def __init__(self, value=None, next=None):
        self.value = value
        self.next = next

class LinkList():
    def __init__(self):
        self.root = Node()  # 代表头
        self.size = 0  # 代表有几个数据
        self.next = None  # 通过设置next的值为0,来记录最后一个节点是谁,方便新加数据时,安排在那个元素后面
    
    def append(self, value):
        node = Node(value)  # 实例化
        # 判断是否已经有数据
        if not self.next: # 如果没有节点时
            self.root.next = node  # 将新节点挂到root后面
            self.next = node  # 因为self.next的值是None、node的next值是None,所以相当于node代替了self.next
        else:
            self.next.next = node  # 在最后一个节点的next指向node
            self.next = node  # 因为self.next的值是None、node的next值是None,所以相当于node代替了self.next
        self.size += 1
    def append_first(self,value):
        node = Node(value)  # 实例化
        if not self.next:  # 如果没有节点时
            self.root.next = node  # 直接在root后面加节点,相当于在头部加数据
            self.next = node  # 仅有node这一个数据,所以node也是最后一个节点
        else:
            temp = self.root.next  # 获取原来root后面的那个节点
            self.root.next = node  # 将新的节点挂到root上
            node.next = temp  # 新的节点的下一个节点是原来root后面的节点
        self.size += 1
    def __iter__(self):
        """遍历 """
        current = self.root.next
        while current is not self.next:
            yield current.value
            current = current.next
        yield current.value
if __name__ == '__main__':
    link = LinkList()
    link.append('孙悟空')
    link.append('猪八戒')
    link.append_first('唐僧')

    for i in link:
        print(i)

image.png

老师,请问红线处标注的理解是否正确?尤其是红色箭头处

Python 全系列/第十六阶段:数据结构与算法/算法与数据结构(旧) 74楼

代码:

class Array():
    def __init__(self,size=4):
        self.__size=size
        self.__item=[None]*size
        self.__length=0
    def __setitem__(self, key, value):
        self.__item[key]=value
    def __getitem__(self, key):
        return self.__item[key]
    def __iter__(self):
        for i in self.__item:
            yield i
class Heap():
    def __init__(self):
        self.item=Array(8)
        self.count=0
    def add(self,value):
        self.item[self.count]=value
        self.setup(self.count)
        self.count += 1
    def setup(self,index):
        if index>0:
            parent=int((index-1)/2)
            if self.item[parent]<self.item[index]:
                self.item[parent],self.item[index]=self.item[index],self.item[parent]
                self.setup(parent)
    def pop(self,index=0):
        if self.count<=0:
            return None
        else:
            value = self.item[0]
            self.count -= 1
            self.item[0] = self.item[self.count]
            self.item[self.count] = None
            self.setdown(0)
            return value
    def setdown(self,index):
        left=index*2+1
        right=index*2+2
        largest=index
        if right<self.count:
            if self.item[largest]<self.item[right] and self.item[right]>self.item[left]:
                largest=right
            elif self.item[largest]<self.item[right] and self.item[right]<self.item[left]:
                largest=left
            elif self.item[largest]>self.item[right] and self.item[largest]<self.item[left]:
                largest=left
        elif left<self.count:
            if self.item[left]>self.item[largest]:
                largest=left
        if largest !=index:
            self.item[largest],self.item[index]=self.item[index],self.item[largest]
            self.setdown(largest)
heap=Heap()
heap.add(10)
heap.add(15)
heap.add(20)
# heap.pop(20)
heap.pop(10)
for i in heap.item:
    if i:
        print(i)

运行结果:

屏幕截图 2021-04-02 163046.png

老师请问一下,为什么我最大堆删除10以后,再打印,结果还是会显示10?我不是已经把10删除了吗?那么这样结果不应该是20和15吗?

Python 全系列/第十六阶段:数据结构与算法/算法与数据结构(旧) 75楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637