您的位置:首页 > 其它

二叉树的遍历

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;
}
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
海贼路飞王 发布了10 篇原创文章 · 获赞 0 · 访问量 124 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: