Java一套拳法刷掉n个遍历树的问题
我不害怕曾經練過一萬種踢法的人,但我害怕一種踢法練過一萬次的人(by 叶师傅的徒弟Bruce Lee)
树的遍历(Traversal)
如下图, 三种遍历方式, 可用同一种递归思想实现
1. 144. 先序遍历(PreOrder, 按照先访问根节点的顺序)
示例 1:1\2/3 输入:root = [1,null,2,3]
输出:[1,2,3]
/** @lc app=leetcode.cn id=144 lang=java** [144] 二叉树的前序遍历*/// @lc code=start
/*** Definition for a binary tree node.* 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;* }* }*/
class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();dfs(root, list);return list;}private void dfs(TreeNode root, List<Integer> list) {if (root == null) return;list.add(root.val);dfs(root.left, list);dfs(root.right, list);}
}
// @lc code=end
2. 94 中序遍历(InOrder, 按照根节点在中间访问的顺序)
示例:1\2/3 输入:root = [1,null,2,3]
输出:[1,3,2]
class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();dfs(root, list);return list;}private void dfs(TreeNode root, List<Integer> list) {if (root == null) return;dfs(root.left, list);list.add(root.val);dfs(root.right, list);}
}
3. 145 后续遍历(PosterOrder, 按照根节点在后面访问的顺序)
示例:输入: [1,null,2,3] 1\2/3 输出: [3,2,1]
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();dfs(root, list);return list;}private void dfs(TreeNode root, List<Integer> list) {if (root == null) return;dfs(root.left, list);dfs(root.right, list);list.add(root.val);}
}
4. 100. 相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
输入:p = [1,2,3], q = [1,2,3]
输出:true
class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {if ((p == null && q != null) || (p != null && q == null)) return false;if (p == null && q == null) return true;return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);}
}
5. 226 翻转二叉树
示例:输入:4/ \2 7/ \ / \
1 3 6 9
输出:4/ \7 2/ \ / \
9 6 3 1
备注:
这个问题是受到 Max Howell 的 原问题 启发的 :
谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。
class Solution {public TreeNode invertTree(TreeNode root) {if (root == null) return root;TreeNode left = root.left;TreeNode right = root.right;root.left = invertTree(right);root.right = invertTree(left);return}
}
6. 590. N 叉树的后序遍历
N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
输入:root = [1,null,3,2,4,null,5,6]
输出:[5,6,3,2,4,1]
/** @lc app=leetcode.cn id=590 lang=java** [590] N 叉树的后序遍历*/// @lc code=start
/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {public List<Integer> postorder(Node root) {List<Integer> list = new ArrayList<>();dfs(root, list);return list;}private void dfs(Node root, List<Integer> list) {if (root == null) return;for(Node node: root.children) {dfs(node, list);}list.add(root.val);}
}
// @lc code=end
7. 103. 二叉树的锯齿形层序遍历
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
给定二叉树 [3,9,20,null,null,15,7],3/ \9 20/ \15 7
返回锯齿形层序遍历如下:[[3],[20,9],[15,7]
]
/** @lc app=leetcode.cn id=103 lang=java** [103] 二叉树的锯齿形层序遍历*/// @lc code=start
/*** Definition for a binary tree node.* 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;* }* }*/
class Solution {public List<List<Integer>> zigzagLevelOrder(TreeNode root) {List<List<Integer>> result = new ArrayList<>();if (root == null) {return result;}boolean isLeftToRight = true;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {Deque<Integer> levelDeque = new LinkedList<>();int size = queue.size();for (int i = 0; i < size; i++) {TreeNode node = queue.poll();if (isLeftToRight) {levelDeque.offerLast(node.val);} else {levelDeque.offerFirst(node.val);}if (node.left != null) queue.offer(node.left);if (node.right != null) queue.offer(node.right);}result.add(new LinkedList<Integer>(levelDeque));isLeftToRight = !isLeftToRight;}return result;}
}
// @lc code=end
8. 230. 二叉搜索树中第K小的元素
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例 1:3/ \1 4\2
输入:root = [3,1,4,null,2], k = 1
输出:1
class Solution {public int kthSmallest(TreeNode root, int k) {List<Integer> list = new ArrayList<>();dfs(root, k, list);return list.get(k - 1);}private void dfs(TreeNode root, int k, List<Integer> list) {if (root == null || list.size() == k) return;dfs(root.left, k, list);list.add(root.val);dfs(root.right, k, list);}
}
9. 102. 二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],3/ \9 20/ \15 7
返回其层序遍历结果:[[3],[9,20],[15,7]
]
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> result = new ArrayList<>();dfs(root, 0, result);return result;}private void dfs(TreeNode root, int level, List<List<Integer>> result) {if (root == null) return;if (result.size() == level) {result.add(new ArrayList<Integer>());}result.get(level).add(root.val);dfs(root.left, level + 1, result);dfs(root.right, level + 1, result);}
}
10. 199. 二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:1 <---/ \
2 3 <---\ \5 4 <---
基本思路: 先序遍历, 记录每一层深度下的节点的值, 并先记录左节点再记录右节点, 则最后记录的值即为该层深度的右视图看到的值
class Solution {public List<Integer> rightSideView(TreeNode root) {List<List<Integer>> allList = new ArrayList<>();List<Integer> list = new ArrayList<>();if (root == null) return list;dfs(root, 0, allList);for (int i = 0; i < allList.size(); i++) {list.add(allList.get(i).get(allList.get(i).size() - 1));}return list;}private void dfs(TreeNode root, int level, List<List<Integer>> allList) {if (root == null) return;if (level == allList.size()) allList.add(new ArrayList<Integer>());allList.get(level).add(root.val);dfs(root.left, level + 1, allList);dfs(root.right, level + 1, allList);}
}
11. 104. 二叉树的最大深度
给定二叉树 [3,9,20,null,null,15,7],3/ \9 20/ \15 7
class Solution {public int maxDepth(TreeNode root) {return root == null ? 0 : 1 + Math.max(maxDepth(root.left), maxDepth(root.right));}
}
12. 107. 二叉树的层序遍历 II
给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
3/ \9 20/ \15 7
[[15,7],[9,20],[3]
]
class Solution {public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List<Integer>> reverse = new ArrayList<>();dfs(root, 0, reverse);List<List<Integer>> result = new ArrayList<>();for (List<Integer> list: reverse) {result.add(0, list);}return result;}private void dfs(TreeNode root, int level, List<List<Integer>> result) {if (root == null) return;if (result.size() == level) result.add(new ArrayList<Integer>());result.get(level).add(root.val);dfs(root.left, level + 1, result);dfs(root.right, level + 1, result);}
}
参考
https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal/solution/yi-tao-quan-fa-shua-diao-nge-bian-li-shu-de-wen–3/
Java一套拳法刷掉n个遍历树的问题相关推荐
- 外包3年,吃透这三份Java程序员必刷的算法宝典后,已从13K涨到25K
懂点算法,很有必要 "不学数据结构和算法,一辈子都是码畜".不管你是 Java 程序员.算法工程师.数据分析师,还是技术管理者.架构师...... 我们都有一个共同的目标,就是在技 ...
- JAVA UDP套接字编程
JAVA UDP套接字编程 UDP套接字 无连接 非可靠传输 面向数据报 package com.lius.udp;import java.io.IOException; import java.ne ...
- Java使用策略模式替换掉 if else
Java使用策略模式替换掉 if else 我们的代码中常常大量的使用 if else ,如果条件在不断的增加,我们就需要继续在后面增加if else,代码就会越来越臃肿,可读性差,后期非常不好维护, ...
- 中大计算机考研复试刷人太狠,惨!658人进复试刷掉570多人!盘点21考研复试比奇高、刷人狠的院校专业!...
原标题:惨!658人进复试刷掉570多人!盘点21考研复试比奇高.刷人狠的院校专业! 嗨,未来的研究生们,大家好呀! 大家都知道,想要考上研究生都是付出了很大的时间和精力的.学姐只希望小伙伴们在辛苦备 ...
- 微信支付java版v2.0_刷卡支付-翟东平-专题视频课程
微信支付java版v2.0_刷卡支付-1814人已学习 课程介绍 微信支付系列课程将讲解"刷卡支付"."扫码支付"."公众号支付&qu ...
- 浙大计算机复试被刷再战,浙大复试刷掉笔试“第一”,录取了倒数第一,这就是考研的公平?...
原标题:浙大复试刷掉笔试"第一",录取了倒数第一,这就是考研的公平? 随着时代的不断发展,我们对教育也是越来越重视,尤其是高等教育这一领域,如今用人单位和企业对学历也是越来越注重, ...
- java如何将数据保存为xml6_用Java实现可保存状态的数据库生成XML树,源码来了(9)...
用Java实现可保存状态的数据库生成XML树,源码来了(9) 时间:2006/7/19 5:38:30 作者:佚名 人气:30 6.3.2.Servlet源码 1.RefreshServlet.jav ...
- PAT甲级刷题记录-(AcWing)-(Day06树 8题)
PAT甲级刷题记录-(AcWing)-(Day06树 8题) 课程来源AcWing 其中AcWing中的题目为翻译好的中文题目 今日刷题列表 1110 Complete Binary Tree 111 ...
- java遍历树(深度遍历和广度遍历)
java遍历树 如现有以下一颗树:A B B1 B11 B2 B22 C ...
- java 实现最优二叉树_哈夫曼树(最优二叉树)及其Java实现
一.定义 一些定义: 节点之间的路径长度:在树中从一个结点到另一个结点所经历的分支,构成了这两个结点间的路径上的经过的分支数称为它的路径长度 树的路径长度:从树的根节点到树中每一结点的路径长度之和.在 ...
最新文章
- meetup_如何使用标准库和Node.js构建Meetup Slack机器人
- asp.net core上使用redis探索(1)
- 回调函数与DOM事件
- python中的线程threading.Thread()使用
- 前端入行两年--教会了我这些道理
- [LeetCode]题解(python):068-Text Justification
- C++的占位符std::placeholder
- S_ISREG等几个常见的宏(转)
- fdisk硬盘分区(1)——系统盘剩余空间创建分区
- C语言小游戏,游戏设计,500+行代码
- 出去计算机写保护,u盘写保护怎么去掉
- 似然函数(likehood)和概率分布(probability)
- JavaScript小纸条
- java惊魂_我的世界孤儿院惊魂
- 曲速未来 发布:新基建下,区块链将急速发展
- 导入数据库显示服务器发生意外,mysql 数据库无法启动(Ignoring the redo log due to missing M...
- 如何下载Direct3D9Ex
- 富士施乐248b粉盒清零_打印机DocuPrintM228B如何清零
- 【C# 教程系列第 10 篇】c# 中如何让指定类不能被继承?
- python运用turtle绘制大众车标
热门文章
- springsecurity登出的配置信息以及登出的认证效果
- erp系统原理和实施第五版pdf_ERP系统实施费用!
- r语言plotmds_利用R语言进行数据分析
- linux离线卸载docker,Linux系统下Docker的安装与卸载
- 纯CSS在线气泡提示生成工具 - CSS ARROW PLEASE!
- 2018年全国卷Ⅰ卷理科数学图片版
- vue - webpack.dev.conf.js for FriendlyErrorsPlugin
- linux快速安装mysql教程
- 《Puppet权威指南》——第1章 运维工程师的利器——自动化运维工具
- tcpdump 的TCP输出结果详解