当前位置: 首页 > news >正文

二叉树的遍历 Java

二叉树的遍历

  • 递归法
    • 前序遍历
    • 中序遍历
    • 后序遍历
    • 改进
  • 迭代法
    • 前序、后序遍历
    • 中序遍历
  • Java 中 null、NULL、nullptr 区别

public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val = val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}

递归法

前序、中序、后序怎么区分?
前、中、后其实描述的是,根节点(一颗树有左子树、根节点、右子树)的访问时间。
前序遍历:根节点->左子树->右子树。
中序遍历:左子树->根节点->右子树。
后序遍历:左子树->右子树->根节点。

LeetCode题目:144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历。

前序遍历

class Solution {List<Integer> mylist = new ArrayList<Integer>();public List<Integer> preorderTraversal(TreeNode root) {if(root == null) return mylist;mylist.add(root.val);preorderTraversal(root.left);preorderTraversal(root.right);return mylist;}
}

在这里插入图片描述

中序遍历

class Solution {List<Integer> mylist = new ArrayList<Integer>();public List<Integer> inorderTraversal(TreeNode root) {if(root == null) return mylist;inorderTraversal(root.left);mylist.add(root.val);inorderTraversal(root.right);return mylist;}
}

在这里插入图片描述

后序遍历

class Solution {List<Integer> mylist = new ArrayList<Integer>();public List<Integer> postorderTraversal(TreeNode root) {if(root == null) return mylist;postorderTraversal(root.left);postorderTraversal(root.right);mylist.add(root.val);return mylist;}
}

在这里插入图片描述

改进

以前序遍历为例,以下是代码随想录的代码。

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<Integer>();preorder(root, result);return result;}public void preorder(TreeNode root, List<Integer> result) {if (root == null) {return;}result.add(root.val);preorder(root.left, result);preorder(root.right, result);}
}

迭代法

以下是笔记,from 代码随想录

编程语言实现递归的逻辑,是用栈这种数据结构实现的。

前序、后序遍历

注意,栈操作中,判断是否为空的方法,有两个,isEmpty 和 empty 都可以。

前序:
前序遍历是 根左右,所以压入栈的顺序应该是右、左

class Solution {public List<Integer> preorderTraversal(TreeNode root) {Stack<TreeNode> s = new Stack<>();List<Integer> ans = new  ArrayList<Integer>();if(root == null) return ans;else s.push(root);while(!s.isEmpty()) {TreeNode tmp = s.pop();ans.add(tmp.val);if(tmp.right != null) s.push(tmp.right);if(tmp.left != null) s.push(tmp.left);}return ans;}
}

在这里插入图片描述
后序:
前序遍历顺序是 根左右,后续是左右根,只需要把上文中的前序遍历的顺序变成 根右左,然后反转结果数组/list就可以。

反转的方法: Collections.reverse(ans);

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();if(root == null) return ans;Stack<TreeNode> stack = new Stack<>();stack.push(root);while(!stack.isEmpty()) {TreeNode tmp = stack.pop();ans.add(tmp.val);if(tmp.left != null) stack.push(tmp.left);if(tmp.right != null) stack.push(tmp.right);}Collections.reverse(ans);return ans;}
}

在这里插入图片描述

中序遍历

中序遍历的访问顺序和处理顺序是不一样的。一棵树,是从根节点开始访问的。前序遍历的根左右顺序保证了访问顺序和处理顺序相同。
但是中序遍历的顺序是左根右。

Java 中 null、NULL、nullptr 区别

(1)NULL 不是 Java 中的关键字
在这里插入图片描述
(2)nullptr 不是 Java 中的关键字
在这里插入图片描述

(3)在 Java 中,null 表示“没有值”或“空”。它是一个关键字,用于表示一个对象变量不引用任何对象。这意味着该变量没有指向任何有效的内存地址

http://www.lryc.cn/news/281078.html

相关文章:

  • 数据结构之str类
  • Java电影购票小程序在线选座订票电影
  • 24-1-9 bilibilic++音视频
  • 备案(三)
  • Hotspot源码解析-第十九章-ClassLoaderData、符号表、字符串表的初始化
  • impala元数据自动刷新
  • 骑砍战团MOD开发(35)-射击精度系统
  • 树莓派非常实用的程序-3 vcdbg
  • jmeter分布式服务搭建
  • vue中el-radio无法默认选中
  • 分布式I/O应用于智慧停车场的方案介绍
  • node后端+vue前端实现接口请求时携带authorization验证
  • SourceTree管理git
  • 【数模百科】一篇文章讲清楚灰色预测模型GM(1,1)附python代码
  • openssl3.2 - 官方demo学习 - mac - hmac-sha512.c
  • pycharm的使用技巧
  • 如何通过内网穿透实现公网访问Portainer管理监控Docker容器
  • Redis原理篇(Dict的收缩扩容机制和渐进式rehash)
  • Microsoft Remote Desktop for Mac 中文正式版下载 微软远程连接软件
  • 解读Vue的原型及原型链
  • 拓扑排序(优先队列)queue、C++
  • 【Spring】SpringBoot 统一功能处理
  • 拦截器HandlerInterceptor | springmvc系列
  • 【SQL server】DML触发器监控数据库字段值改变
  • Docker容器(二)安装与初体验wordpress
  • Odrive 学习系列二:将烧录工具从ST-Link V2修改为JLink
  • ffmpeg api-codec-param-test.c源码讲解
  • Hive学习(14)json解析get_json_object()函数
  • sqlilabs第五十五五十六关
  • Vue2 实现带输入的动态表格,限制el-input输入位数以及输入规则(负数、小数、整数)