python二叉树遍历模板

深度遍历

递归版本

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    # 前序遍历
    def preorderTraversal(self, root: TreeNode) -> list[int]:
        if not root:
            return []
        left = self.preorderTraversal(root.left)
        right = self.preorderTraversal(root.right)

        return [root.val] + left + right

    # 中序遍历
    def inorderTraversal(self, root: TreeNode) -> list[int]:
        if not root:
            return []
        left = self.preorderTraversal(root.left)
        right = self.preorderTraversal(root.right)

        return left + [root.val] + right

    # 后序遍历
    def postorderTraversal(self, root: TreeNode) -> list[int]:
        if not root:
            return []
        left = self.preorderTraversal(root.left)
        right = self.preorderTraversal(root.right)

        return left + right + [root.val]

非递归版本

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    # 前序遍历
    def preorderTraversal(self, root: TreeNode) -> list[int]:
        # 根结点为空则返回空列表
        if not root:
            return []
        stack = [root]
        result = []
        while stack:
            node = stack.pop()
            # 中结点先处理
            result.append(node.val)
            # 右孩子先入栈
            if node.right:
                stack.append(node.right)
            # 左孩子后入栈
            if node.left:
                stack.append(node.left)
        return result

    # 中序遍历
    def inorderTraversal(self, root: TreeNode) -> list[int]:
        if not root:
            return []
        stack = []  # 不能提前将root结点加入stack中
        result = []
        cur = root
        while cur or stack:
            # 先迭代访问最底层的左子树结点
            if cur:
                stack.append(cur)
                cur = cur.left
            # 到达最左结点后处理栈顶结点
            else:
                cur = stack.pop()
                result.append(cur.val)
                # 取栈顶元素右结点
                cur = cur.right
        return result

    # 后序遍历
    def postorderTraversal(self, root: TreeNode) -> list[int]:
        if not root:
            return []
        stack = [root]
        result = []
        while stack:
            node = stack.pop()
            # 中结点先处理
            result.append(node.val)
            # 左孩子先入栈
            if node.left:
                stack.append(node.left)
            # 右孩子后入栈
            if node.right:
                stack.append(node.right)
        # 将最终的数组翻转
        return result[::-1]

非递归版本(代码统一)

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    # 前序遍历
    def preorderTraversal(self, root: TreeNode) -> list[int]:
        result = []
        st = []
        if root:
            st.append(root)
        while st:
            node = st.pop()
            if node != None:
                if node.right:  # 右
                    st.append(node.right)
                if node.left:  # 左
                    st.append(node.left)
                st.append(node)  # 中
                st.append(None)
            else:
                node = st.pop()
                result.append(node.val)
        return result

    # 中序遍历
    def inorderTraversal(self, root: TreeNode) -> list[int]:
        result = []
        st = []
        if root:
            st.append(root)
        while st:
            node = st.pop()
            if node != None:
                if node.right:  # 添加右节点(空节点不入栈)
                    st.append(node.right)

                st.append(node)  # 添加中节点
                st.append(None)  # 中节点访问过,但是还没有处理,加入空节点做为标记。

                if node.left:  # 添加左节点(空节点不入栈)
                    st.append(node.left)
            else:  # 只有遇到空节点的时候,才将下一个节点放进结果集
                node = st.pop()  # 重新取出栈中元素
                result.append(node.val)  # 加入到结果集
        return result

    # 后序遍历
    def postorderTraversal(self, root: TreeNode) -> list[int]:
        result = []
        st = []
        if root:
            st.append(root)
        while st:
            node = st.pop()
            if node != None:
                st.append(node)  # 中
                st.append(None)

                if node.right:  # 右
                    st.append(node.right)
                if node.left:  # 左
                    st.append(node.left)
            else:
                node = st.pop()
                result.append(node.val)
        return result

层次遍历

from collections import deque


class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def levelOrder(self, root: TreeNode) -> list[int]:
        if not root:
            return []
        queue = deque([root])
        result = []
        while queue:
            node = queue.popleft()
            result.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        return result

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以帮你写一个Python程序,实现二叉树模板。下面是一个简单的例子:class Node: def __init__(self, data): self.data = data self.left = None self.right = None # Tree class Tree: def __init__(self): self.root = None def getRoot(self): return self.root def add(self, data): if self.root is None: self.root = Node(data) else: self._add(data, self.root) def _add(self, data, node): if data < node.data: if node.left is None: node.left = Node(data) else: self._add(data, node.left) else: if node.right is None: node.right = Node(data) else: self._add(data, node.right) def find(self, data): if self.root: return self._find(data, self.root) else: return None def _find(self, data, node): if data == node.data: return node elif data < node.data and node.left is not None: self._find(data, node.left) elif data > node.data and node.right is not None: self._find(data, node.right) def deleteTree(self): # garbage collector will do this for us. self.root = None ### 回答2: 二叉树是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点,分别为左子节点和右子节点。我们可以使用Python语言编写一个简单的二叉树模板。 首先,我们定义一个节点类来表示二叉树的节点。每个节点有一个值和两个指针,指向左子节点和右子节点。节点类的代码如下: ```python class TreeNode: def __init__(self, value): self.val = value self.left = None self.right = None ``` 接下来,我们可以使用递归的方式创建二叉树。假设我们有一个列表 `values`,其中存储了二叉树的节点值。我们可以通过遍历列表,依次创建每个节点,并将节点按照特定的规则连接起来。创建二叉树的函数代码如下: ```python def createBinaryTree(values): if not values: return None root = TreeNode(values[0]) queue = [root] i = 1 while queue and i < len(values): node = queue.pop(0) if values[i] is not None: node.left = TreeNode(values[i]) queue.append(node.left) i += 1 if i < len(values) and values[i] is not None: node.right = TreeNode(values[i]) queue.append(node.right) i += 1 return root ``` 以上代码中,我们使用队列来辅助创建二叉树。我们首先创建根节点,并将它加入队列。然后,挨个遍历列表中的节点值。对于每个节点,我们弹出队列中的头节点,并根据列表的值创建左子节点和右子节点。接下来,将这些新创建的节点加入队列。最后,返回树的根节点即可。 可以使用以下代码测试二叉树模板的功能: ```python values = [1, 2, 3, None, 5, 6, 7] root = createBinaryTree(values) # 打印二叉树 def printBinaryTree(root): if not root: return print(root.val) printBinaryTree(root.left) printBinaryTree(root.right) printBinaryTree(root) ``` 以上代码中的 `values` 列表表示以下二叉树的结构: ``` 1 / \ 2 3 / \ 5 6 / 7 ``` 输出结果为: ``` 1 2 3 5 6 7 ``` 以上是一个基本的二叉树模板,可以根据需要进行扩展和修改,来满足更复杂的二叉树操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值