最近用的大模型感言. (附drawtree.py模块)

最近用的大模型感言. (附drawtree.py模块)

大多数大模型,不能正确回答我提出的问题。或许我的问题要求很高吧。
只是对于已有的一些大众化的知识能列出来,比如问把C++中STL里vector的所有函数出来。
这样弱知的问题,只要在数据库里搜索一下找最接近的就行了。
对于创新型的问题,只能装模作样的给出一个答案,至于正不正确,最终还要依靠人来验证,所以是不可靠的。
毕竟,大模型还是没有意识的。由此推理,现阶段的自动驾驶汽车你敢去做吗?

上月帮别人做了一个演示DFS和BFS的小作品,做了个漂亮的界面还有背景音乐啥的。
这个作品中其中的一个核心代码如下所示:
它只是根据前序遍历和中序遍历,把二叉树画出来,并不会演示DFS和BFS动画。读者可以自己去增加GUI。

"""
封装了一个叫DrawTree的类。
它能根据二叉树的前序遍历和中序遍历,求后序遍历,并且用海龟把二叉树画出来。

"""
from turtle import TurtleScreen, RawTurtle, TK


class Node:            # 树的结点
    def __init__(self,val):
        self.value = val
        self.parent = None
        self.left = None
        self.right = None
        
class DrawTree:
    
    def __init__(self,haigui):
        self.haigui = haigui
        self.cors = {}        # 此字典用于保存每个顶点对应的坐标
        self.pre_order_s = [] # 保存前序遍历这个序列
        self.in_order_s = []   # 保存中序遍历这个序列
        self.post_order_s=[]  # 保存后序遍历的列表
        self.level_order_s=[]  # 保存按层(BFS)遍历的列表
        
    def build_tree(self,pre_order,in_order): # 根据前序遍历和中序遍历构建树
        if len(pre_order)==0 or len(in_order)==0 :return None
        root_val = pre_order[0]  # 因为前序遍历的第一个肯定是根
        pos = in_order.index(root_val) # 根据值在中序遍历找到root_val,并且返回索引号
        root = Node(root_val)        
        root.left = self.build_tree(pre_order[1:pos+1],in_order[:pos])
        root.right = self.build_tree(pre_order[pos+1:],in_order[pos+1:])
        if root.left: root.left.parent = root
        if root.right: root.right.parent = root
        self.root = root
        return root

    def post_order(self):
        """后序遍历"""
        if self.root!=None:            
            if self.root.left:
                bk = self.root
                self.root = self.root.left
                self.post_order()
                self.root = bk
            if self.root.right:
                bk = self.root
                self.root = self.root.right
                self.post_order()
                self.root = bk            
            self.post_order_s.append(self.root.value)
            
    def level_order(self):
        """按层遍历BFS"""
        queue = []   # 建立队列
        queue.append(self.root) # 入队
        while queue:
            node = queue.pop(0)  #  出队
            self.level_order_s.append(node.value)
            if node.left:queue.append(node.left)
            if node.right:queue.append(node.right)                        
           
                
    def fd2(self,distance):   
        self.haigui.penup();self.haigui.fd(distance*0.2);self.haigui.pendown()
        self.haigui.fd(distance*0.6);self.haigui.penup();self.haigui.stamp();self.haigui.fd(distance*0.2)

    def draw_dot(self,num):  # 在坐标点打点,并在点上写上数字
        dx = 0
        dy = -10
        ft = ('宋体',14,'normal')
        pos = self.haigui.position()
        self.haigui.dot(30,'orange')
        self.haigui.dot(26,'blue')
        x = pos[0] + dx
        y = pos[1] + dy
        self.haigui.goto(x,y)
        self.cors[num] = pos  # 记录每个点的坐标
        self.haigui.color('white')
        self.haigui.write(num,align='center',font=ft)
        self.haigui.color('black')
        self.haigui.goto(pos)

    def draw_binary_tree(self,pre_order,in_order,root_pos=(0,200)):
        self.cors.clear()
        self.pre_order_s = pre_order[:] # 保存前序遍历这个序列
        self.in_order_s = in_order[:]   # 保存中序遍历这个序列
        self.post_order_s.clear()           # 清空后序遍历列表
        self.level_order_s.clear()          # 清空按层次遍历这个列表 
        self.build_tree(pre_order,in_order) # 根据序列构建二叉树
        self.post_order()           # 后序遍历,为的是保存序列到self.post_order_s列表
        self.level_order()           # 按层遍历(BFS)
        self.haigui.goto(root_pos)          # 到达根结点的坐标
        self.haigui.clear()
        self._draw_BST_tree()               # 最终调用它来画二叉树
 
    def _draw_BST_tree(self,dis=150,angle=45): # 画二叉树,请把它进行美化
        """hg:海龟,tree:树的根结点,dis:距离,angle:张开角度"""
        self.draw_dot(self.root.value)    
        if self.root.left!=None:
            self.root = self.root.left
            self.haigui.right(angle);self.fd2(dis);self.haigui.left(angle)
            self._draw_BST_tree(dis*0.85,angle*0.62);self.haigui.right(angle)
            self.haigui.bk(dis);self.haigui.left(angle)
            self.root = self.root.parent
        if self.root.right!=None:
            self.root = self.root.right
            self.haigui.left(angle);self.fd2(dis);self.haigui.right(angle)
            self._draw_BST_tree(dis*0.85,angle*0.62);self.haigui.left(angle)
            self.haigui.bk(dis);self.haigui.right(angle)
            self.root = self.root.parent
    def clear(self):
        self.haigui.clear()

if __name__ == '__main__':
    import time
    time.sleep(0)
    orders = [("1245367","4251637"),("EHBCFADG","BHFCAEDG"),("ABDEC","DBEAC"),("12453","42513"),
              ("124895AB36CD7EF","8492A5B1C6D3E7F"),("ABCDEFG","ABCDEFG"),([19,13,11,30,25,65],[11,13,19,25,30,65]),
              ([19,13,11,9,6,12,30,25,22,60,70,88],[6,9,11,12,13,19,22,25,30,60,70,88]),
              ([19,13,11,9,8,4,12,30,25,22,23,60,45,38,52,70,72,83],[4,8,9,11,12,13,19,22,23,25,30,38,45,52,60,70,72,83]),
              ([19,13,11,9,8,4,1,2,3,10,12,15,30,25,22,21,23,60,45,38,52,48,55,70,62,72,83,99],[1,2,3,4,8,9,10,11,12,13,15,19,21,22,23,25,30,38,45,48,52,55,60,62,70,72,83,99]) ]

    orders = [("124895AB36CD7EF","8492A5B1C6D3E7F")]
    root = TK.Tk()    
    canvas = TK.Canvas(root,width=920,height=800)# 新建画布
    canvas.pack()

    screen = TurtleScreen(canvas)                # 新建海龟屏幕
    screen.bgcolor('#FFF4F6')                    # 设定背景颜色
    screen.delay(0)

    # RawTurtle类就是原始海龟类,它是Turtle的父类
    raw = RawTurtle(screen,visible=False)

    raw.speed(0)
    raw.penup()
    raw.right(90)
    d = DrawTree(raw)  # 用raw来画图
    for pre_order,in_order in orders[:-1]:
        d.draw_binary_tree(pre_order,in_order,(0,350))
        time.sleep(0.1)
        #d.clear()
    d.draw_binary_tree(*orders[-1],(0,350))
screen.mainloop()

    

李兴球

李兴球的博客是Python创意编程原创博客