python写一个二叉树

先来设计下怎么实现二叉树,首先一个节点类和树类是需要的,所以需要class node 和class tree

class node:
   def __init__(self):
       pass

class tree:
   def __init__(self):
       pass

接下来是看功能,节点和树需要实例化,同时树需要一个add方法来把新的节点加进去,可以确定的是,无论是树实例化时根节点是空的,节点类实例化时则是有数的。

class Node(object):
    def __init__(self,number):
        self.number=number
        self.rchild=None
        self.lchild=None


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

    def add(self,number):
        pass
                

接下来就是核心问题,怎么把增加新节点,第一步当然要先判断树是否为空

def add(self,number):
    node=Node(number)
    if self.root==None:
        self.root=node
    else:
        pass

在确定树不为空之后要怎么处理呢?

我们来看下二叉树的结构

 

         由于这里只是单纯的二叉树,而不是排序二叉树,所以不需要考虑数的大小关系等,也就是说可以按先后顺序插入顺序可以设计成root,root->left,root-rght这样,好处在于,root插入后,root左右为空,这时插入root->left,然后再是root->right,这样能够确保root的2个子节点都有值,而不至于绕过root->rigth直接插入root->left->left这样的异常情况出现。

         基于这样的设计,我们使用list来存储任意子节点为空的节点,换句话说,只要你这个节点不是左右节点都存在的情况下,我下次插入节点就会考虑你。具体实现我们使用list来模拟队列,root,root->left,root->right依次入队,

class Node(object):
    def __init__(self,number):
        self.number=number
        self.lchild=None
        self.rchild=None


class Tree(object):

    lis=[]
    def __init__(self):
        self.root=None

    def add(self,number):
        node=Node(number)

        if self.root==None:
            self.root=node
            Tree.lis.append(self.root)
        else:
            while True:
                point=Tree.lis[0]

                if point.lchild==None:
                    point.lchild=node
                    Tree.lis.append(point.lchild)
                    return
                elif point.rchild==None:
                    point.rchild=node
                    Tree.lis.append(point.rchild)
                    Tree.lis.pop(0)
                    return

        add基本的逻辑就是利用队列依次保存未满状态的节点,然后通过不断取队头来添加左右孩子,并把左右孩子加入队列,插入完后检查是否走有孩子都有了,依然未满,则保留,满了,则退出队列取下一个队首。

       现在我们来测试:

if __name__=='__main__':
    t=Tree()
    L = [1,2,3,4,5,6,7]
    for x in L:
        t.add(x)
        print 'success'

E:\protalenv\Scripts\python.exe C:/Users/26954/Desktop/shel.py
success
success
success
success
success
success
success

Process finished with exit code 0

可以看到二叉树成功的建立了

以下是使用Python实现一个二叉树的示例代码: ```python class Node: def __init__(self, data): self.left = None self.right = None self.data = data class BinaryTree: def __init__(self): self.root = None def addNode(self, node, data): if node is None: self.root = Node(data) else: if data < node.data: if node.left is None: node.left = Node(data) else: self.addNode(node.left, data) else: if node.right is None: node.right = Node(data) else: self.addNode(node.right, data) def printInOrder(self, node): if node is not None: self.printInOrder(node.left) print(node.data) self.printInOrder(node.right) # 测试代码 bt = BinaryTree() bt.addNode(bt.root, 5) bt.addNode(bt.root, 3) bt.addNode(bt.root, 7) bt.addNode(bt.root, 1) bt.addNode(bt.root, 9) bt.printInOrder(bt.root) ``` 在这个示例代码中,我们定义了一个 Node 类来表示二叉树的节点,它包含左子节点、右子节点和数据。我们还定义了一个 BinaryTree 类,它包含一个根节点和 addNode() 和 printInOrder() 方法。 addNode() 方法用于向二叉树中添加新的节点。如果当前节点是空的,则创建一个新的根节点。否则,如果新数据小于当前节点的数据,则将其添加到左子树中,否则将其添加到右子树中。 printInOrder() 方法用于按顺序打印二叉树中的所有节点。它首先遍历左子树,然后打印当前节点,最后遍历右子树。 在测试代码中,我们创建了一个 BinaryTree 对象,并向其中添加了一些数据。然后,我们使用 printInOrder() 方法按顺序打印所有节点的值。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值