二叉树(python)

class Node(object):
    """节点类"""
    def __init__(self, elem=-1, lchild=None, rchild=None):
        self.elem = elem
        self.lchild = lchild
        self.rchild = rchild
class Tree(object):
    """树类"""
    def __init__(self):
        self.root = Node()
        self.myQueue = []
    def add(self, elem):
        """为树添加节点"""
        node = Node(elem)
        if self.root.elem == -1:  # 如果树是空的,则对根节点赋值
            self.root = node
            self.myQueue.append(self.root)
        else:
            treeNode = self.myQueue[0]  # 此结点的子树还没有齐。
            if treeNode.lchild == None:
                treeNode.lchild = node
                self.myQueue.append(treeNode.lchild)
            else:
                treeNode.rchild = node
                self.myQueue.append(treeNode.rchild)
                self.myQueue.pop(0)  # 如果该结点存在右子树,将此结点丢弃。

    def PreOrderTree(self, root,x):
        """利用递归实现树的先序遍历"""
        if root == None:
            return
        x.append(root.elem)
        self.PreOrderTree(root.lchild,x)
        self.PreOrderTree(root.rchild,x)
    def Find(self, root,elem1):
        if root == None:
            return
        myStack = []
        node = root
        while node or myStack:
            while node:
                myStack.append(node)
                node = node.lchild
            node = myStack.pop()
            if elem1 == node.elem:
                return node
            node = node.rchild
    def insert(self,root,node):
        if root.lchild == None:
            root.lchild = node
        else:
            root.rchild = node
    def LaOrderTree(self, root,z):
        """利用递归实现树的后序遍历"""
        if root == None:
            return
        self.LaOrderTree(root.lchild,z)
        self.LaOrderTree(root.rchild,z)
        z.append(root.elem)

    def InOrderTree(self,root,y):
        """利用堆栈实现树的中序遍历"""
        if root == None:
            return
        myStack = []
        node = root
        while node or myStack:
            while node:
                myStack.append(node)
                node = node.lchild
            node = myStack.pop()
            y.append(node.elem)
            node = node.rchild
if __name__ == '__main__':
    """主函数"""
    x = []
    y = []
    z = []
    tree = Tree()
    while True:
        q = int(input())
        if q == 1:
            n = int(input())
            if n == 1:
                tree.add(0)
            if n > 1:
                for i in range(n - 1):
                    A = []
                    A = list(map(int, input().split()))
                    if i == 0:
                        tree.add(A[0])
                    if tree.Find(tree.root, A[0]) is None:
                        break
                    tree.insert(tree.Find(tree.root, A[0]), Node(A[1]))
        if q == 2:
            tree.PreOrderTree(tree.root, x)
            s = str(x[0])
            for i in x[1::]:
                s += ' ' + str(i)
            print(s)
        if q == 3:
            tree.InOrderTree(tree.root, y)
            s = str(y[0])
            for i in y[1::]:
                s += ' ' + str(i)
            print(s)
        if q == 4:
            tree.LaOrderTree(tree.root, z)
            s = str(z[0])
            for i in z[1:]:
                s += ' ' + str(i)
            print(s)
        if q == 0:
            break





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值