二叉树先中后序输出(利用栈)

先序

# 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 xianxu(self, root: Optional[TreeNode]) -> List[int]:
        stack=[root]#利用栈存储
        output=[]#输出的列表
        if not root:#空树直接返回
            return [] 
        while stack:
            node=stack.pop() #栈顶出栈
            output.append(node.val) #输出列表存值
            if node.right: #先存右节点,后出
                stack.append(node.right)
            if node.left: #后存左节点,先出
                stack.append(node.left)
        return output

中序

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        stack=[]#利用栈存储
        node=root #保存节点
        output=[]#输出的列表
        if not root:#空树直接返回
            return [] 
        while stack or node:
            while node: #先保存当前节点,然后找左节点
                stack.append(node)
                node=node.left
            node=stack.pop() #栈顶出栈
            output.append(node.val) #输出列表存值
            node=node.right #出栈后找当前右节点
        return output

后序

# 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 inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        stack=[]#利用栈存储
        node=root #保存节点
        output=[]#输出的列表
        if not root:#空树直接返回
            return [] 
        while stack or node:
            while node: #先保存当前节点,然后找左节点
                stack.append(node)
                if node.left:
                    node=node.left
                else:
                    node=node.right
            node=stack.pop() #找到叶子节点,栈顶出栈
            output.append(node.val) #输出列表存值
            if stack and stack[-1].left==node: #如果栈顶为此时叶子节点的父亲节点,找父亲节点的右节点    
                node=stack[-1].right
            else:
                node=None
        return output

  • 14
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 二叉树、后遍历的简单方法如下: 1. 前遍历:访问根节点,再递归遍历左子树和右子树。 2. 遍历:递归遍历左子树,再访问根节点,最后递归遍历右子树。 3. 后遍历:递归遍历左子树和右子树,最后访问根节点。 其,递归是实现这三种遍历方式的常用方法。具体实现步骤如下: 1. 前遍历:输出当前节点的值,再递归遍历左子树和右子树。 ``` void preorder(TreeNode* root) { if (root == nullptr) return; cout << root->val << " "; preorder(root->left); preorder(root->right); } ``` 2. 遍历:递归遍历左子树,再输出当前节点的值,最后递归遍历右子树。 ``` void inorder(TreeNode* root) { if (root == nullptr) return; inorder(root->left); cout << root->val << " "; inorder(root->right); } ``` 3. 后遍历:递归遍历左子树和右子树,最后输出当前节点的值。 ``` void postorder(TreeNode* root) { if (root == nullptr) return; postorder(root->left); postorder(root->right); cout << root->val << " "; } ``` 以上就是二叉树、后遍历的简单方法。 ### 回答2: 二叉树是一种常见的数据结构,常用的三种遍历方式为前遍历、遍历和后遍历。以下是三种遍历方式的简单方法。 1. 前遍历:首访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。可以用递归函数来实现前遍历,代码如下: ``` void preOrder(Node* root) { if(root == nullptr) { return; } cout << root->data << " "; preOrder(root->left); preOrder(root->right); } ``` 2. 遍历:首递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。同样地,可以用递归函数来实现遍历,代码如下: ``` void inOrder(Node* root) { if(root == nullptr) { return; } inOrder(root->left); cout << root->data << " "; inOrder(root->right); } ``` 3. 后遍历:首递归地遍历左子树,然后递归地遍历右子树,最后访问根节点。同样地,可以用递归函数来实现后遍历,代码如下: ``` void postOrder(Node* root) { if(root == nullptr) { return; } postOrder(root->left); postOrder(root->right); cout << root->data << " "; } ``` 通过递归函数可以简单地实现二叉树的前和后遍历。如果要求非递归实现,可以利用数据结构来辅助遍历过程。 ### 回答3: 二叉树的前遍历,遍历和后遍历是常用的三种二叉树遍历方法。 1. 前遍历:首访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。 2. 遍历:首递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。 3. 后遍历:首递归地遍历左子树,然后递归地遍历右子树,最后访问根节点。 对于二叉树的前和后遍历,可以通过递归方法实现。 对于前遍历,可以按照下面的步骤实现: 1. 如果树为空,直接返回。 2. 访问根节点。 3. 递归地对根节点的左子树进行前遍历。 4. 递归地对根节点的右子树进行前遍历。 对于遍历,可以按照下面的步骤实现: 1. 如果树为空,直接返回。 2. 递归地对根节点的左子树进行遍历。 3. 访问根节点。 4. 递归地对根节点的右子树进行遍历。 对于后遍历,可以按照下面的步骤实现: 1. 如果树为空,直接返回。 2. 递归地对根节点的左子树进行后遍历。 3. 递归地对根节点的右子树进行后遍历。 4. 访问根节点。 通过递归方法实现三种遍历方式可以确保遍历的顺正确。使用这些简单方法,可以方便地对二叉树进行前和后遍历。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值