LeetCode——二叉树遍历
时间:2020-03-07
本文章向大家介绍LeetCode——二叉树遍历,主要包括LeetCode——二叉树遍历使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
先序
递归:
public static ArrayList<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> array = new ArrayList<>();
if (root == null)
return array;
preorder(root, array);
return array;
}
public static void preorder(TreeNode root, ArrayList<Integer> array) {
if (root == null)
return;
array.add(root.val);
preorder(root.left, array);
preorder(root.right, array);
}
非递归:
public ArrayList<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> array = new ArrayList<>();
if (root == null)
return array;
Stack<TreeNode> s = new Stack<>();
TreeNode node = root;
while (node != null || !s.empty()) {
while (node != null) {
//遍历到左子树下面,边遍历边保存
array.add(node.val);
s.push(node);
node = node.left;
}
if (!s.empty()) {
node = s.peek();
s.pop();
//进入右子树,再在下一步遍历左子树
node = node.right;
}
}
return array;
}
中序
递归:
public static ArrayList<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> array = new ArrayList<>();
if (root == null)
return array;
inorder(root, array);
return array;
}
public static void inorder(TreeNode root, ArrayList<Integer> array) {
if (root == null)
return;
inorder(root.left, array);
array.add(root.val);
inorder(root.right, array);
}
非递归:
public static ArrayList<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> array = new ArrayList<>();
if (root == null)
return array;
Stack<TreeNode> s = new Stack<>();
TreeNode node = root;
while (node != null || !s.empty()) {
while (node != null) {
s.push(node);
node = node.left;
}
if(!s.empty()){
node = s.peek();
array.add(node.val);
s.pop();
node = node.right;
}
}
return array;
}
后序
递归:
public static ArrayList<Integer> postorderTraversal(TreeNode root){
ArrayList<Integer> array = new ArrayList<>();
if(root == null)
return array;
posorder(root, array);
return array;
}
public static void posorder(TreeNode root, ArrayList<Integer> array){
if(root == null)
return;
posorder(root.left, array);
posorder(root.right, array);
array.add(root.val);
}
非递归
public static ArrayList<Integer> postorderTraversal(TreeNode root) {
ArrayList<Integer> array = new ArrayList<>();
if (root == null)
return array;
Stack<TreeNode> stack = new Stack<>();
//当前节点
TreeNode node = root;
//访问的前一个节点
TreeNode last = null;
while (node != null) {
stack.push(node);
//移到左子树最下面
node = node.left;
}
while (!stack.empty()) {
node = stack.peek();
stack.pop();
//如果右子树为空或右子树被访问过
if (node.right == null || node.right == last) {
array.add(node.val);
last = node;
} else {
//重新把当前点放进去
stack.push(node);
//读取右子树
node = node.right;
while (node != null) {
//把右子树的左子树递归放入
stack.push(node);
node = node.left;
}
}
}
return array;
}
层序
public static ArrayList<Integer> levelTraversal(TreeNode root) {
ArrayList<Integer> array = new ArrayList<>();
if(root == null)
return array;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
TreeNode node;
while(!queue.isEmpty()){
node = queue.peek();
array.add(node.val);
queue.poll();
if(node.left!=null)
queue.offer(node.left);
if(node.right!=null)
queue.offer(node.right);
}
return array;
}
原文地址:https://www.cnblogs.com/xym4869/p/12436373.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- keras做CNN的训练误差loss的下降操作
- Python基于yaml文件配置logging日志过程解析
- Python ckeditor富文本编辑器代码实例解析
- PHP自定义错误处理的方法分析
- PHP聊天室简单实现方法详解
- phpStorm+XDebug+chrome 配置详解
- PHP面向对象程序设计之多态性的应用示例
- PHP设计模式之单例模式定义与用法分析
- PHP面向对象程序设计之接口的继承定义与用法详解
- PHP简单验证码功能机制实例详解
- php高清晰度无损图片压缩功能的实现代码
- Python自省及反射原理实例详解
- 浅谈django框架集成swagger以及自定义参数问题
- keras CNN卷积核可视化,热度图教程
- 解决tensorflow读取本地MNITS_data失败的原因