数据结构之二叉树

我们已经学了三个结构了,链表、栈、队列,但是它们都是线性结构,很难使用它们组织对象的分层表示。为了避免这种限制,我们创建了树这个结构。

树由节点和弧组成,与自然界的树不同的是,我们所说的树是倒着的:根在上,叶子结点在下。根没有父节点只有子节点,叶节点没有子节点或者子节点是空结构。

在一棵树中,每个节点都可以经都可以从根节点经一个唯一的弧序列到达,此弧序列被称为路径,路径中弧的数量称为路径的长度。节点的层次是从根节点到该节点的路径的长度加一,也就是该路径上节点的数量。非空树的高度是树中节点的最大层次。空树的高度是0,单节点是高度为一的树。极端的情况下,树会退化成链表。

二叉树

二叉树是节点可以包含两个子节点(也可以为空)的树,每一个子节点都区分做子节点或右子节点。二叉树的一个重要性质就是其叶节点的数量,该性质在评价排序算法的期望效率的时候会用到。

二叉树的基本实现
1、插入节点
2、寻找节点
3、二叉树的遍历:广度优先遍历、深度优先遍历(递归、非递归)

想必看过我们之前的文章的同学们都知道,广度优先搜索和深度优先搜索都单独写了一篇文章来介绍,不过在这里的话,我们就不能说的这么详细了,看完本文还有疑惑的小伙伴可以在基础算法篇中看一下具体的搜索算法

二叉树的python实现

class node:
    """
    节点类,包含data存储信息
    left指向左节点
    right指向右节点
    """
    def __init__(self, data, left = None, right = None):
        self.data = data
        self.right = right
        self.left = left
        
class tree:
    
    def __init__(self):
    	#根节点初始化为None
        self.root = None 
    
    def Insert(self, data):
    	#插入操作
        if self.root == None:
            self.root =node(data)
        else:
            p = self.root
            while True:
                if data < p.data:
                    if p.left == None:
                        p.left = node(data)
                        break
                    else:
                        p = p.left
                        continue
                else:
                    if p.right == None:
                        p.right = node(data)
                        break
                    else:
                        p = p.right
                        continue
    
    def Find(self, data):
    	#按数据寻找
        p = self.root
        sstack = [p]
        while sstack:
            p = sstack.pop(0)
            if p.data == data : return 1
            if p.left : sstack.append(p.left)
            if p.right : sstack.append(p.right)
        
        return -1
    
    def BFS(self):
    	#广度优先搜索
        p = self.root
        queue = [p]
        while queue:
            p = queue.pop(0)
            print(p.data)
            if p.left : queue.append(p.left)
            if p.right : queue.append(p.right)
    
    def DFS(self):
    	#深度优先搜索
        p = self.root
        sstack = [p]
        while sstack:
            p = sstack.pop(-1)
            print(p.data)
            if p.right : sstack.append(p.right)
            if p.left : sstack.append(p.left)
    
    def VLR(self,node):
    	#前序遍历
        if node:
            print(node.data)
            self.dfs(node.left)
            self.dfs(node.right)
        

欢迎关注公众号 : 数学算法实验室
算法与人工智能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值