二叉树遍历(Python)

遍历二叉树

#0 GitHub

https://github.com/Coxhuang/binary-tree-traversal

#1 环境

Python3.7.3

#2 开始

#2.1 层次遍历

#1 思路分析
#2 代码实现
# Definition for a binary tree node.
class TreeNode:
    """
    节点
    """
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
class Solution:
    def levelOrderBottom(self, root):
        """
        层次遍历
        :param root: 根节点
        :return: list_node -> List 
        """

        queue_node = [root]  # 队列
        list_node = []  # 层次遍历存放结果列表

        while queue_node:  # 队列不为空,一直循环

            node = queue_node.pop()  # 出队
            if not node: # 节点为空, 从头开始, 不把空节点放入结果列表 
                continue
            list_node.append(node.val) # 把节点数值存放到结果列表 
            queue_node.insert(0, node.left) # 左节点先入队 
            queue_node.insert(0, node.right) # 右节点后入队 

        print(list_node) 
        return list_node
    
#3 测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P4c6WPPM-1592190636424)(https://raw.githubusercontent.com/Coxhuang/yosoro/master/20190525095214-image.png)]


输出

# 层次遍历
[3, 9, 20, 15, 7]

#2.2 先序遍历

#1 思路
#2 代码实现
# Definition for a binary tree node.
class TreeNode:
    """
    节点
    """
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def levelOrderBottom(self, root):
        """
        先序遍历
        :param root: 根节点
        :return: list_node -> List
        """
        stack_node = [root]  # 栈
        list_node = []  # 先序遍历结果存放列表

        while stack_node: # 栈不为空
            node = stack_node.pop() # 栈顶节点出栈
            if not node: # 节点为空
                continue
            list_node.append(node.val) # 把不为空的节点数值存到列表
            stack_node.append(node.right) # 右节点先压栈
            stack_node.append(node.left) # 左节点后压栈
        print(list_node)
        return list_node
    
    def preOrderBottom_re(self, root):
        """
        先序遍历 递归
        :param root: 根节点
        :return: list_node -> List
        """
        
        if not root:
            return None
        print(root.val)
        self.preOrderBottom_re(root.left)
        self.preOrderBottom_re(root.right)
#3 测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JUbAzF2v-1592190636426)(https://raw.githubusercontent.com/Coxhuang/yosoro/master/20190525101331-image.png)]

#2.3 中序遍历

#1 思路
#2 代码实现
# Definition for a binary tree node.
class TreeNode:
    """
    节点
    """
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def levelOrderBottom(self, root):
        """
        中序遍历 非递归
        :param root:  根节点
        :return: list_node -> List
        """
        stack_node = []  # 栈
        list_node = []  # 中序遍历结果存放列表
        node_p = root # 当前节点
        while stack_node or node_p: # 当前节点不为空 or 栈不为空

            while node_p: # 一直移动到最左端
                stack_node.append(node_p) # 节点压栈
                node_p = node_p.left # 指针左移

            node = stack_node.pop() # 出栈 
            list_node.append(node.val) # 获取节点数据 
            node_p = node.right # 获取有节点
        print(list_node)
        return list_node
    
    def inOrderBottom_re(self, root):
        """
        中序遍历 递归
        :param root: 根节点
        :return: list_node -> List
        """

        if not root:
            return None
        self.inOrderBottom_re(root.left)
        print(root.val)
        self.inOrderBottom_re(root.right)
#3 测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-30numNOj-1592190636428)(https://raw.githubusercontent.com/Coxhuang/yosoro/master/20190525121439-image.png)]


#2.4 后序遍历

#1 思路
#2 代码实现
# Definition for a binary tree node.
class TreeNode:
    """
    节点
    """
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def levelOrderBottom(self, root):
        """
        后序遍历 非递归
        :param root: 根节点
        :return: list_node -> List
        """
        stack_node = [root]
        list_node = []

        while stack_node:
            node = stack_node.pop()

            if node.left: # 左孩子不为空
                stack_node.append(node.left) # 左孩子压栈
            if node.right: # 右孩子不为空
                stack_node.append(node.right) # 右孩子压栈

            list_node.append(node.val) # 获取当前指针数值

        list_node.reverse() # 取反
        return list_node
    
    def postOrderBottom_re(self, root):
        """
        后序遍历 递归
        :param root: 根节点
        :return: list_node -> List
        """

        if not root:
            return None
        self.postOrderBottom_re(root.left)
        self.postOrderBottom_re(root.right)
        print(root.val)
#3 测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eqPv59IX-1592190636429)(https://raw.githubusercontent.com/Coxhuang/yosoro/master/20190525151530-image.png)]



  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是Python二叉树遍历方法的示例代码: ```python # 定义二叉树节点类 class TreeNode: def __init__(self, data): self.data = data self.left_child = None self.right_child = None # 定义二叉树类 class BinaryTree: def __init__(self): self.root = None # 插入节点 def insert(self, data): new_node = TreeNode(data) if self.root is None: self.root = new_node else: current = self.root while True: if data < current.data: if current.left_child is None: current.left_child = new_node return else: current = current.left_child else: if current.right_child is None: current.right_child = new_node return else: current = current.right_child # 层次遍历 def level_order_traversal(self, start): if start is None: return queue = [] queue.append(start) while len(queue) > 0: print(queue[0].data, end=' ') node = queue.pop(0) if node.left_child is not None: queue.append(node.left_child) if node.right_child is not None: queue.append(node.right_child) # 先序遍历 def preorder_traversal(self, start): if start is None: return print(start.data, end=' ') self.preorder_traversal(start.left_child) self.preorder_traversal(start.right_child) # 中序遍历 def inorder_traversal(self, start): if start is None: return self.inorder_traversal(start.left_child) print(start.data, end=' ') self.inorder_traversal(start.right_child) # 后序遍历 def postorder_traversal(self, start): if start is None: return self.postorder_traversal(start.left_child) self.postorder_traversal(start.right_child) print(start.data, end=' ') ``` 以上代码中,`BinaryTree`类定义了二叉树的节点和插入节点的方法,以及四种遍历方法:层次遍历先序遍历中序遍历后序遍历。其中,层次遍历使用了队列,而其他三种遍历方法使用了递归。 以下是使用示例: ```python # 创建二叉树 tree = BinaryTree() tree.insert(5) tree.insert(3) tree.insert(7) tree.insert(1) tree.insert(4) tree.insert(6) tree.insert(8) # 层次遍历 print('层次遍历:', end=' ') tree.level_order_traversal(tree.root) print() # 先序遍历 print('先序遍历:', end=' ') tree.preorder_traversal(tree.root) print() # 中序遍历 print('中序遍历:', end=' ') tree.inorder_traversal(tree.root) print() # 后序遍历 print('后序遍历:', end=' ') tree.postorder_traversal(tree.root) print() ``` 输出结果为: ``` 层次遍历: 5 3 7 1 4 6 8 先序遍历: 5 3 1 4 7 6 8 中序遍历: 1 3 4 5 6 7 8 后序遍历: 1 4 3 6 8 7 5 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值