二叉树的【层序遍历】【垂序遍历】具体思路,文中包含多种方法(附完整代码)


前言

本文将主要围绕以下问题进行讨论:

二叉树的层序遍历、垂序遍历。

层序遍历的两种方法 【迭代法】【递归法】

垂序遍历的两种方法 【递归排序】【哈希递归】

对于垂序遍历的方法多种多样,大家也可以多多尝试不同的思路。


一、如何理解二叉树的层序遍历?

从根节点开始,首先访问根节点,然后依次访问根节点的每一层的所有节点。从第一层开始,自上而下,从左至右依次访问每一层的节点。

题目链接: [点击跳转] Leetcode 102. 二叉树的层序遍历

请添加图片描述


二、二叉树层序遍历

1.方法一(迭代法)

进行广度优先搜索,所以选择借助先进先出的队列。

引用辅助队列,首先对传入节点进行判断,若不为空,压入队列中。
这时,进入循环(直至队列为空:所有节点全部遍历完成停止)

在if循环中遍历出同一层的所有节点,再指向两侧子节点。

如下代码可以实现层序遍历,并且已标注好每句的作用:

class Solution {
   
public:
    vector<vector<int>> tre;//用于存储最终的层序遍历结果,其中每个子向量代表一层的节点值。
    queue<TreeNode*> que;//用于辅助实现层序遍历,存储待处理的节点。
    vector<vector<int>> levelOrder(TreeNode* root) {
   
        if (root == nullptr) {
   
            return tre;
        }
        que.push(root);//如果根节点不为空,将根节点root放入队列que中
        while (!que.empty()) {
   //进入循环,只要队列不为空,就一直进行
            int size = que.size();//记录当前队列的大小size,这个大小代表了当前层的节点数量
            vector<int> level;//创建一个临时向量level,用于存储当前层的节点值
            for (int i = 0; i < size; i++) {
   
                TreeNode* node = que.front();//取出队首节点node
                que.pop();//并将其从队列中弹出
                level.push_back(node
### 如何用Java实现二叉树垂直遍历算法 在Java中实现二叉树垂直遍历可以通过多种方法完成,其中一种常见的方式是利用哈希表来记录每个节点与其对应的水平距离之间的关系。以下是基于这种方法具体实现: #### 方法概述 为了实现二叉树垂直遍历,可以采用广度优先搜索(BFS)或者深度优先搜索(DFS),并结合哈希表存储节点及其对应的距离信息。通过这种方式,能够按列收集节点并将它们按照从左到右的顺序输出。 #### 具体实现步骤 下面是一个完整的Java代码示例,展示了如何使用队列和哈希映射来进行二叉树垂直遍历[^1]。 ```java import java.util.*; class TreeNode { int val; TreeNode left, right; public TreeNode(int x) { this.val = x; this.left = null; this.right = null; } } public class VerticalOrderTraversal { public List<List<Integer>> verticalOrder(TreeNode root) { Map<Integer, List<Integer>> map = new TreeMap<>(); Queue<TreeNode> nodeQueue = new LinkedList<>(); Queue<Integer> colQueue = new LinkedList<>(); if (root != null) { nodeQueue.add(root); colQueue.add(0); // 初始根节点位于第0列 } while (!nodeQueue.isEmpty()) { TreeNode currentNode = nodeQueue.poll(); int currentCol = colQueue.poll(); if (!map.containsKey(currentCol)) { map.put(currentCol, new ArrayList<>()); } map.get(currentCol).add(currentNode.val); if (currentNode.left != null) { nodeQueue.add(currentNode.left); colQueue.add(currentCol - 1); // 左子节点向左移动一列 } if (currentNode.right != null) { nodeQueue.add(currentNode.right); colQueue.add(currentCol + 1); // 右子节点向右移动一列 } } return new ArrayList<>(map.values()); // 返回按列排序的结果 } public static void main(String[] args) { TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.left = new TreeNode(4); root.left.right = new TreeNode(5); root.right.left = new TreeNode(6); root.right.right = new TreeNode(7); VerticalOrderTraversal traversal = new VerticalOrderTraversal(); System.out.println(traversal.verticalOrder(root)); // 输出垂直遍历结果 } } ``` 上述代码定义了一个`TreeNode`类表示二叉树中的节点,并实现了`verticalOrder`函数用于执行垂直遍历操作。该函数的核心逻辑在于维护两个队列——分别保存待处理的节点以及这些节点所处的列号。最终借助有序字典(`TreeMap`)将同一列内的所有数值聚合起来形成最终结果列表[^2]。 #### 关键点解析 - **水平距离**:对于任意给定的父节点P来说,其左侧孩子L具有较小(-1单位变化量),而右侧孩子R则较大(+1单位变化量)[^3]。 - **数据结构选择**:这里选用的是`TreeMap`而非普通的HashMap,因为前者能自动依据key值升序排列条目,从而简化后续整理工作流程。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值