二叉树的遍历
2020-03-31 19:32
423 查看
面试题54. 二叉搜索树的第k大节点
给定一棵二叉搜索树,请找出其中第k大的节点。
示例 1:
输入: root = [3,1,4,null,2], k = 1
输出: 4
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
输出: 4
解题过程
二叉搜索树,中序遍历就是从小到大的顺序。
class Solution { List<Integer> arr = new ArrayList<>(); public int kthLargest(TreeNode root, int k){ midOrderSearch(root); return arr.get(arr.size()-k); } private void midOrderSearch(TreeNode root){ if(root==null){ return ; } midOrderSearch(root.left); arr.add(root.val); midOrderSearch(root.right); } }
但是看答案后发现这样做时间复杂度太高,需要遍历整个树,于是又可以优化。
class Solution { int res = 0,count = 0; public int kthLargest(TreeNode root, int k){ midOrderSearch(root ,k); return res; } private void midOrderSearch(TreeNode root, int k){ if(root==null){ return ; } midOrderSearch(root.right,k); if(++count==k){ res = root.val; } midOrderSearch(root.left,k); } }
面试题32 - II. 从上到下打印二叉树 II
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
解题过程
二叉树层次遍历的经典题目了,必须掌握!!!!、
class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> list = new ArrayList<>(); Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); while(!queue.isEmpty()){ List<Integer> arr = new ArrayList<>(); int cnt = queue.size(); while(cnt-->0){ TreeNode node = queue.poll(); if(node==null){ continue; } arr.add(node.val); queue.offer(node.left); queue.offer(node.right); } if(arr.size()!=0){ list.add(arr); } } return list; } }
面试题32 - I. 从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回:
[3,9,20,15,7]
解题过程
这题和上面那题差不多,唯一不同的就是返回数组,不知道数组的长度怎么定义呢,先定义一个ArrayList,在利用list.size()创建数组,复制过去就行了。
class Solution { public int[] levelOrder(TreeNode root) { List<Integer> list = new ArrayList<>(); Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); while(!queue.isEmpty()){ TreeNode node = queue.poll(); if(node==null){ continue; } list.add(node.val); queue.add(node.left); queue.add(node.right); } int[] arr = new int[list.size()]; for(int i = 0;i<arr.length;i++){ arr[i]=list.get(i); } return arr; } }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 二叉树的遍历(2)--先序遍历,中序遍历,后序遍历(非递归)
- 数据结构之二叉树(遍历、建立、深度)
- 非递归遍历二叉树
- 二叉树的前序中序后序遍历相关问题
- 栈和队列在遍历二叉树中的使用
- SDUTOJ 2136 数据结构实验之二叉树的建立与遍历
- 二叉树前序、中序、后序遍历非递归写法的透彻解析
- 剑指offer面试题23:从上到下打印二叉树(树的层序遍历)
- 二叉树-根据已知的遍历顺序还原二叉树
- HDU 1710 二叉树的遍历(已知前序和中序求后序)
- SICP 2.28 遍历二叉树的叶子节点
- python实现二叉树,以及二叉树的遍历
- 分层次遍历二叉树
- 今天开始学Java 二叉树的遍历
- 二叉树的遍历(后序+中序)
- 输入一组整数后用c语言数据结构对其进行大小比较以二叉树存储、遍历
- 6.2二叉树的遍历
- 二叉树非递归实现先序,中序,后序,按层遍历
- 二叉树的三种遍历方式:递归、栈、循环
- 二叉树各种遍历