《程序员面试金典》输出单层节点

时间:2022-12-29 00:37:59

题目:对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表。
给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。

解析:该题目考察的知识点较多,有层次遍历法求树的深度,并且还考察了单链表的创建。但是我们逐个击破的话,该题目只是把多个知识点融合在一起,并不难。解题思想就是用队列来层次遍历二叉树,然后用集合list记录每一层遍历出来的节点值,当达到某一深度dep,就利用该层的节点值创建为单链表,并返回。

import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;

ListNode(int val) {
this.val = val;
}
}*/
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}*/
public class TreeLevel {
public ListNode getTreeLevel(TreeNode root, int dep) {
ListNode head =null;//单链表表头
Queue<TreeNode> queue = new LinkedList<>();//队列,层次遍历二叉树的节点的时候保存节点信息
List<Integer> list = new ArrayList<>();//存储一层的节点信息,
if(root==null){
return head;
}
queue.add(root);
int current =1;//当前层的节点数
int next=0;//下一层的节点数
int level=0;//记录层次遍历的深度
while (!queue.isEmpty()){
TreeNode node = queue.poll();
list.add(node.val);
current--;
if(node.left!=null){
queue.add(node.left);
next++;
}
if(node.right!=null){
queue.add(node.right);
next++;
}
if(current==0){
level++;
if(level==dep){//已经遍历到所需要的深度了
break;
}
current=next;
next=0;
list = new ArrayList<>();//没有到需要的深度,需要继续重新创建list收集下一层的节点信息
}
}
head = new ListNode(list.get(0));//注意一般的题目head都带值的
for(int i=list.size()-1;i>=1;i--){//头插法创建单链表返回
ListNode node = new ListNode(list.get(i));
node.next=head.next;
head.next=node;
}
return head;
}
}