二叉树的遍历算法

目录

1.二叉树结构

2.广度优先搜索二叉树(迭代算法)

3.深度优先搜索二叉树(递归算法)


1.二叉树结构

一个父结点,至多可以连接左右两个子节点

Java构造树结构------其实是 自定义树结点类型

java 复制代码
 public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(){}
        TreeNode(int val){
            this.val = val;
        }
        TreeNode(int val,TreeNode lefTreeNode,TreeNode righTreeNode){
            this.val = val;
            left = lefTreeNode;
            right = righTreeNode;
        }
        
    }

2.广度优先搜索二叉树(迭代算法)

原理 :(1)从上到下分层

(2)每层从左往右

解答:

(1)队列(先进先出)来迭代一层内的结点------更新队列,加入存在的左右子结点

(2)直到下一层无结点,循环再停止------该层队列为空

(3)每一层是检索 上一层更新的队列,但队列可能会在本层有新增结点------检索前先记录上一层队列数量,按此数量,一个个弹出队头并检索。

以下是示范代码:

java 复制代码
  public List<List<Integer>> levelOrder(TreeNode root) {
        ArrayDeque<TreeNode> deque = new ArrayDeque<TreeNode>();
        List<List<Integer>> compeleteList = new ArrayList<>();
        if (root == null) {
            return compeleteList;
        }
        deque.offer(root);
        while (!deque.isEmpty()) {
            List<Integer> arrList = new ArrayList<>();
            int dSize = deque.size();
            for(int i=0;i<dSize;++i ){
                TreeNode node = deque.poll();
                if (node.left != null) {
                    deque.offer(node.left);
                }
                if (node.right != null) {
                    deque.offer(node.right);
                }
                arrList.add(node.val);
            }
            compeleteList.add(arrList);
        }
        return compeleteList;
    }

3.深度优先搜索二叉树(递归算法)

设计思路:

(1)哪里进入下一层

(2)给上一层返回什么

(3)最底层终止条件

实例1:前序遍历

以树中间某一点 作为当前点 思考

(1)不断进入下一层,将左右子节点分别传入,作为下一层根结点

(2)若递归函数有返回值,考虑接收到本层变量,经处理返回上一层

(3)最后一层终止return 一般0,Null或者啥都无,按返回类型决定

java 复制代码
    ArrayList<Integer> list = new ArrayList<>();

    public void preorder(TreeNode root){
        if (root == null) {
            return;
        }
        list.add(root.val);
        preorder(root.left);
        preorder(root.right);
    }

实例2:检测二叉树对称性

java 复制代码
 public boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return true;
        }
        return dfs(root.left, root.right);
        
    }
       boolean dfs(TreeNode left,TreeNode right){
        if (left==null && right == null) {
            return true;
        }
        if (left == null || right == null) {
            return false;
        }
        if (left.val != right.val) {
            return false;
        }
        return dfs(left.left, right.right) && dfs(right.left, left.right);

    }
相关推荐
2601_967760784 小时前
2026年PDF压缩与页码添加工具技术实测:性能、算法与本地化适配深度对比
算法·pdf
不会就选b5 小时前
算法日常・每日刷题--<贪心>7
数据结构·算法·leetcode
moonrailgun5 小时前
用 Node.js 复刻 Codex Astra 的终端星光
前端·javascript·算法
罗西的思考6 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(1)--- 总体
人工智能·算法·机器学习
lvwangshu7 小时前
图论:LCA、树的直径、树的重心、二分图与 Tarjan 缩点
算法·图论
爱吃苹果的日记本7 小时前
数据结构第一课
c语言·数据结构·数据库·学习·c#
张小姐的猫7 小时前
【AI大模型接入SDK】 —— Gemini接入封装
android·数据结构·数据库·c++·人工智能·python
302wanger7 小时前
干与湿:AI 拿走脑力之后,人剩下什么
算法
计算机编程-吉哥8 小时前
脑肿瘤MRI智能识别系统:基于深度学习的像素级脑肿瘤语义分割平台【计算机毕业设计选题推荐】
人工智能·python·深度学习·算法·毕业设计·课程设计·大数据毕业设计选题推荐
用户204937554959 小时前
端侧语音部署踩坑:模型能跑不等于终端真的能用
后端·算法