(Python3)数据结构——11.排序二叉树的原理和实现

前言

  • 有Python基础
  • 知道二叉树的概念,可以参考 https://blog.csdn.net/sf9898/article/details/105007041

原理

  • 排序二叉树(或者叫二叉排序树)

在这里插入图片描述

  • 上面的定义来自于百度百科。上面有一点,没有键值相等的结点。但是有的地方又说可以相等,无论怎么样,这一点在代码上的差距无非是if语句里面多写与少写几行罢了。
  • 根据排序二叉树的定义,它和普通二叉树的区别主要是在插入部分还要做判断,小盆友往左边走,大盆友走右边(比当前值大的往右边,比当前值小的往左边),因此可以继承一下二叉树的方法,之后重新写下添加的方法。

实现

  • 根据上面提到的进行实现,继承一下二叉树的部分代码
class Node(object):
    def __init__(self, item):
        self.item = item
        self.left = None
        self.right = None


class SortedTree(object):
    def __init__(self):
        self.root = None

    def travel(self):
        if self.root is None:
            return
        q = [self.root]
        while q:
            nd = q.pop(0)
            print(nd.item, end=' ')
            if nd.left:
                q.append(nd.left)
            if nd.right:
                q.append(nd.right)
        print('')

    def forward(self, root):
        if root is None:
            return
        print(root.item, end=' ')
        self.forward(root.left)
        self.forward(root.right)

    def middle(self, root):
        if root is None:
            return
        self.middle(root.left)
        print(root.item, end=' ')
        self.middle(root.right)

    def back(self, root):
        if root is None:
            return
        self.back(root.left)
        self.back(root.right)
        print(root.item, end=' ')
  • 写下add函数
    def add(self, item):
        node = Node(item)
        if self.root is None:
            # 如果当前根节点是空的,那么直接当根节点
            self.root = node
            return
        cur = self.root
        while cur:
            if item > cur.item:
                # 输入的这个数比当前的node的item还大,那说明应该排在当前结点的右边
                if cur.right:
                    cur = cur.right
                else:
                    # 这个位置是空的额,那么直接挂在这就行了
                    cur.right = node
                    break
            else:
                # 小于或等于就挂左边了
                if cur.left:
                    cur = cur.left
                else:
                    # 左边没东西就直接挂上
                    cur.left = node
                    break
  • 构造一棵排序二叉树进行测试
st = SortedTree()
st.add(10)
st.add(20)
st.add(3)
st.add(4)
st.add(1100)
st.add(1)
  • 这棵树大致长这样

在这里插入图片描述

  • 对其进行各种遍历,结果如下
    层次遍历:10 3 20 1 4 1100
    前序遍历:10 3 1 4 20 1100
    中序遍历:1 3 4 10 20 1100
    后序遍历:1 4 3 1100 20 10
  • 验证一下,完整代码
class Node(object):
    def __init__(self, item):
        self.item = item
        self.left = None
        self.right = None


class SortedTree(object):
    def __init__(self):
        self.root = None

    def travel(self):
        if self.root is None:
            return
        q = [self.root]
        while q:
            nd = q.pop(0)
            print(nd.item, end=' ')
            if nd.left:
                q.append(nd.left)
            if nd.right:
                q.append(nd.right)
        print('')

    def forward(self, root):
        if root is None:
            return
        print(root.item, end=' ')
        self.forward(root.left)
        self.forward(root.right)

    def middle(self, root):
        if root is None:
            return
        self.middle(root.left)
        print(root.item, end=' ')
        self.middle(root.right)

    def back(self, root):
        if root is None:
            return
        self.back(root.left)
        self.back(root.right)
        print(root.item, end=' ')

    def add(self, item):
        node = Node(item)
        if self.root is None:
            # 如果当前根节点是空的,那么直接当根节点
            self.root = node
            return
        cur = self.root
        while cur:
            if item > cur.item:
                # 输入的这个数比当前的node的item还大,那说明应该排在当前结点的右边
                if cur.right:
                    cur = cur.right
                else:
                    # 这个位置是空的额,那么直接挂在这就行了
                    cur.right = node
                    break
            else:
                # 小于或等于就挂左边了
                if cur.left:
                    cur = cur.left
                else:
                    # 左边没东西就直接挂上
                    cur.left = node
                    break


st = SortedTree()
st.add(10)
st.add(20)
st.add(3)
st.add(4)
st.add(1100)
st.add(1)
st.travel()
st.forward(st.root)
print('')
st.middle(st.root)
print('')
st.back(st.root)
  • 结果和之前算的一致

在这里插入图片描述

发布了28 篇原创文章 · 获赞 12 · 访问量 4120

猜你喜欢

转载自blog.csdn.net/sf9898/article/details/105011054