【用python实现用二叉链表表示的二叉树类】

用python实现用二叉链表表示的二叉树类,并完成以下操作:(1)创建二叉树;(2)先序、中序、后续遍历二叉树;(3)中序遍历请用非递归算法。

#1、首先我们需要一个节点类和一个树类。
#创建节点类
class Node(object):  
    def __init__(self, item, left = None, right = None):
        self.elem=item
        self.lchild = left
        self.rchild = right

#创建树类
class BinaryTree(object):
    def __init__(self):
        self.root = None     # 给个root根节点,一开始为空,然后添加节点

#2、同时树需要一个add方法来把新节点加进去 添加元素
    def add(self, item): #相当于队列,在左侧弹出元素,在右侧添加元素 
    
       #当根节点为空时
        if self.root is None:
            self.root = Node(item) #当根节点为空时,直接把节点放在空节点的位置,相当于根节点  
            return         
        queue = []
        queue.append(self.root)#将根节点放入列表
        
        while queue:    #当队列不为空时       
            node = queue.pop(0)#弹出0位置上的元素,作为当前需处理的元素
            
            if not node.lchild: #判断当前元素的左子树是否为空 if node.lchild is None:
                node.lchild = Node(item)#if判断是空,则直接将元素接在上面
                return
            else:
                queue.append(node.lchild)
                
            if not node.rchild: #判断当前元素的右子树是否为空 if node.rchild is None:
                node.rchild = Node(item)#if判断是空,则直接将元素接在上面
                return
            else:
                queue.append(node.rchild)
                
#3、广度优先遍历 深度从上到下,层里从左到右
    def breadh_travel(self):
        
        if self.root is None:
            return
        
        queue = []
        queue.append(self.root)
    
        while len(queue)>0:
            node = queue.pop(0)
            print(node.elem, end=" ")
            if node.lchild:
                queue.append(node.lchild)
            if node.rchild:
                queue.append(node.rchild)

#4、先序遍历
#根节点->左子树->右子树
    def preorder_travel(self, root):
        
        if root is None:#若节点为空,则直接返回
            return

        print(root.elem, end=" ")#D
        self.preorder_travel(root.lchild)#L
        self.preorder_travel(root.rchild)#R
        

#5.1、中序遍历
#左子树->根节点->右子树
    def inorder_travel(self, root):
	    if root:#若节点不是空的
	        self.inorder_travel(root.lchild)#L       
	        print(root.elem, end=" ")#D
	        self.inorder_travel(root.rchild)#R
#5.2中序遍历二叉树的非递归过程            
#class Solution(object):
    def inorderTraversal_1(self, root):# 堆栈实现中序遍历(非递归)
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if not root:
            return
        stack = []
        node = root
        while node or stack: # 从根节点开始,一直寻找它的左子树
            while node:
                stack.append(node)
                node = node.lchild
            #if stack:
            node = stack.pop()
            print(node.elem,end=' ')                
            node = node.rchild


#6、后序遍历
#左子树->右子树->根节点
    def postorder_travel(self, root):
	    if root:
	        self.postorder_travel(root.lchild)#L
	        self.postorder_travel(root.rchild)#R
	        print(root.elem, end=" ")#D
#主程序
if __name__=='__main__':
#if name == 'main':
    tree = BinaryTree()
    tree.add(0)
    tree.add(1)
    tree.add(2)
    tree.add(3)
    tree.add(4)
    tree.add(5)
    tree.add(6)
    tree.add(7)
    
    print("广度优先遍历")
    tree.breadh_travel()
    print('\n')
    print("先序遍历")
    tree.preorder_travel(tree.root)
    print('\n')
    print('中序遍历递归')
    tree.inorder_travel(tree.root)
    print('\n')
    print('中序遍历非递归')
    tree.inorderTraversal_1(tree.root)
    print('\n')
    print("后序遍历")
    tree.postorder_travel(tree.root)

这里是引用:参考文章
https://blog.csdn.net/bigpieapple/article/details/100730882

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值