树的前中后序递归遍历

本文介绍了一种采用递归方式实现的树的遍历方法,包括前序、中序和后序遍历。通过具体代码示例展示了如何在满二叉树中使用递归进行节点访问,并解释了递归过程中的回溯机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文记录,采用递归方式进行树的前中后序遍历。本质是走过树的所有节点。

【扩展】前中后序是深度遍历。以前序为例子

在满二叉树的前提下,中序遍历:首先要到达到左侧树的最底部,找到最低的左节点,然后回退到其父节点,找到父节点的右子节点,进行右节点遍历,然后又回退到父节点。依次往复遍历整个树。这递归中也包含了回溯的过程。

package cn.msf.tree;

import java.util.ArrayList;
import java.util.List;

/**
 * @author : msf
 * @date : 2022/12/2
 * 采用递归方法进行树的前,中,后遍历。
 */
public class InorderTraversal {

    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        TreeNode node1 = new TreeNode(2);
        TreeNode node2 = new TreeNode(3);
        root.right = node1;
        node1.left = node2;

        InorderTraversal inorderTraversal = new InorderTraversal();
        List<Integer> result = inorderTraversal.inorderTraversal(root);
        List<Integer> result1 = inorderTraversal.inorderTraversal(root);
        List<Integer> result2 = inorderTraversal.postorderTraversal(root);
        System.out.println(result);
        System.out.println(result1);
        System.out.println(result2);
    }

    /**
     * 中序遍历
     * @param root
     * @return
     */
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        inorder(list,root);
        return list;
    }

    private void inorder(List<Integer> list, TreeNode root) {
        if (root == null) {
            return;
        }
        list.add(root.value);
        inorder(list,root.left);
        inorder(list,root.right);
    }

    /**
     * 前序遍历
     * @param root
     * @return
     */
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        preorder(list,root);
        return list;
    }

    private void preorder(List<Integer> list, TreeNode root) {
        if (root == null) {
            return;
        }

        preorder(list,root.left);
        list.add(root.value);
        preorder(list,root.right);
    }

    /**
     * 后序遍历
     * @param root
     * @return
     */
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        postorder(list,root);
        return list;
    }

    private void postorder(List<Integer> list, TreeNode root) {
        if (root == null) {
            return;
        }

        postorder(list,root.left);
        postorder(list,root.right);
        list.add(root.value);
    }

}




### 二叉的先、中后序递归遍历 #### 先遍历 (Pre-order Traversal) 在先遍历中,访问顺为:根节点 -> 左子 -> 右子。具体过程如下: 1. 访问当节点并记录其值。 2. 对左子执行先遍历。 3. 对右子执行先遍历。 ```python def pre_order_traversal(root): if root is None: return [] result = [] # Visit the current node and add its value to results. result.append(root.val) # Recursively traverse the left subtree. result += pre_order_traversal(root.left) # Recursively traverse the right subtree. result += pre_order_traversal(root.right) return result ``` [^1] #### 中遍历 (In-order Traversal) 对于中遍历而言,遵循的是:左子 -> 根节点 -> 右子 的原则来进行访问。具体步骤如下所示: 1. 执行对左子的中遍历。 2. 当节点被访问并将它的值加入到结果集中。 3. 接着再做一次针对右侧分支同样的动作——即对其实施中遍历。 ```python def in_order_traversal(root): if root is None: return [] result = [] # Traverse the left subtree recursively. result += in_order_traversal(root.left) # Visit this node after traversing all nodes on the left side. result.append(root.val) # Finally, visit the right subtree. result += in_order_traversal(root.right) return result ``` [^2] #### 后序遍历 (Post-order Traversal) 最后来看下后序遍历的方式,在这里我们按照这样的路径去走:左子 -> 右子 -> 根节点 。也就是说要等到左右两个方向都走过之后才会回到最开始的那个位置来做标记工作。 1. 开始时会先进入左侧部分进行探索直到不能再深入为止; 2. 转向右边继续重复上述行为直至结束; 3. 完成以上两步后再回头处理最初的起点处的数据项。 ```python def post_order_traversal(root): if root is None: return [] result = [] # First go as deep into the tree from the left as possible. result += post_order_traversal(root.left) # Then do the same thing but starting with the right child of each parent instead. result += post_order_traversal(root.right) # After exploring both children fully, finally process the current node itself. result.append(root.val) return result ``` [^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兜兜转转m

一毛钱助力博主实现愿望

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值