二叉树

1. 二叉树的基本概念:

  在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆

 

 2.二叉树的遍历方式:

# 定义节点类
class Node():
    def __init__(self,item):
        self.item = item
        self.left = None  # 左叶子节点
        self.right = None  # 右叶子节点

# 定义二叉树类
class Terr():
    def __init__(self):
        self.root = None
    # 添加数据
    def addNode(self,item):
        node = Node(item)
        # 如果插入第一个节点的情况
        if self.root == None:
            self.root = node
            return
        cur = self.root
        q = [cur]    # 列表元素使我们进行遍历判断的节点
        while q:
            nd = q.pop(0)
            if nd.left == None:
                nd.left = node
                return
            else:
                q.append(nd.left)
            if nd.right == None:
                nd.right = node
                return
            else:
                q.append(nd.right)
# 使用                
tree = Terr()
for i in range(1, 8):
    tree.addNode(i)

1.广度优先遍历

 def travel(self):
        cur = self.root
        q = [cur]
        while q:
            nd = q.pop(0)
            print(nd.item)
            if nd.left:
                q.append(nd.left)
            if nd.right:
                q.append(nd.right)

2.深度优先遍历

前序

# 跟左右
    def forwoar(self,root):
        if root == None:
            return
        print(root.item)
        self.forwoar(root.left)
        self.forwoar(root.right)

中序

# 左跟右

    def niddle(self, root):
        if root == None:
            return
        self.niddle(root.left)
        print(root.item)
        self.niddle(root.right)

后序

# 左右跟
    def back(self,root):
        if root == None:
            return
        self.back(root.left)
        self.back(root.right)
        print(root.item)

3.排序二叉树

# 定义节点类
class Node():
    def __init__(self,item):
        self.item = item
        self.left = None
        self.right = None
# 定义排序二叉树类
class SortTree():
    def __init__(self):
        self.root = None
    # 重点:添加新节点
    def add(self,item):
        node = Node(item)
        cur = self.root
        # 二叉树还没有节点的情况
        if self.root == None:
            self.root = node
            return
        '''
        二叉树有节点时循环比较当前节点的值与需要插入的节点的值的大小:
            1.比当前节点值大,向右侧插入,并判断当前右侧是否为空,不是则cur = cur.right 
            2.比当前节点值小,向左侧插入,并判断当前左侧是否为空,不是则cur = cur.left 
            3.循环直到找到左侧或右侧满足条件的某个空位置结束,调出循环
        '''
        while cur:
            #向右侧插入
            if item > cur.item:
                if cur.right == None:
                    cur.right = node
                    break
                else:
                    cur = cur.right

            else:#向左插入
                if cur.left == None:
                    cur.left = node
                    break
                else:
                    cur = cur.left
    # 使用中序的方法来获取有序二叉树的各个节点的值
    def middle(self,root):#前序:左根右
        if root == None:
            return
        self.middle(root.left)
        print(root.item)
        self.middle(root.right)

待续:

原文地址:https://www.cnblogs.com/zangyue/p/12098626.html