python二叉树的实现

class Node(object):

    def __init__(self, item):
        self._data = item
        self._left = None
        self._right = None

    @property
    def data(self):
        return self._data

    @property
    def left(self):
        return self._left

    @property
    def right(self):
        return self._right

    @data.setter
    def data(self, value):
        self._data = value

    @left.setter
    def left(self, value):
        self._left = value

    @right.setter
    def right(self, value):
        self._right = value


class BTree(object):

    def __init__(self, root=None):
        self.root = root

    def add_node(self, value):
        node = Node(value)
        # 如果树是空的,则对根节点赋值
        if self.root is None:
            self.root = node
            return
        else:
            node_list = []
            node_list.append(self.root)
            # 对已经有的节点进行层次遍历,进行插入操作
            while node_list:

                cur = node_list.pop(0)

                if cur.left is None:
                    cur.left = node
                    return
                elif cur.right is None:
                    cur.right = node
                    return
                else:
                    # 如果左右子树都不为空,加入队列继续判断
                    node_list.append(cur.left)
                    node_list.append(cur.right)

    def get_root(self):
        return self.root

    def pre_order1(self, root):
        """ 先序遍历  递归实现
        若二叉树为空,为空操作;否则(1)访问根节点;(2)先序遍历左子树;(3)先序遍历右子树
        根节点——左子节点——右子节点
        """

        if root is None:
            return
        print(root.data)
        self.pre_order1(root.left)
        self.pre_order1(root.right)

    def pre_oder2(self, root):
        """ 先序遍历  迭代实现
        """
        stack = [root]
        while stack:
            s = stack.pop()
            if s:
                print(s.data)
                stack.append(s.right)
                stack.append(s.left)

    def mid_order1(self, root):
        """ 中序遍历 递归方式
        若二叉树为空,为空操作;否则(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。
        左子节点——根节点——右子节点
        """
        if root is None:
            return

        self.mid_order1(root.left)
        print(root.data)
        self.mid_order1(root.right)

    def mid_order2(self, root):
        """ 中序遍历 迭代方式
        """
        stack = []
        while stack or root:
            while root:
                stack.append(root)
                root = root.left
            root = stack.pop()
            print(root.data)
            root = root.right

    def pos_order(self, root):
        """ 后序遍历
        """
        if root is None:
            return
        self.pos_order(root.left)
        self.pos_order(root.right)
        print(root.data)

    def bfs(self, root):
        """ 层次遍历
        """
        queue = [root]
        while queue:
            q = queue.pop(0)
            if q:
                print(q.data)
                queue.append(q.left)
                queue.append(q.right)

    def get_depth(self):

        if self.root is None:
            return 0
        else:
            pass


def main():
    btree = BTree()

    for x in range(11):
        btree.add_node(x)

    y = btree.get_root()
    #
    btree.bfs(y)


def test1():
    node1 = Node(2)
    node2 = Node(3)
    list1 = []
    list1.append(node1)
    list1.append(node2)
    print(list1)
    for x in list1:
        print(type(x))
        print(x)


if __name__ == '__main__':
    main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值