对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表。
给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。
解析:层次遍历的简化版,只需要输出某一层的节点。其实就是左右子树按顺序遍历,只是在递归函数中多检查一步,若当前高度和目标高度相等,则把节点值添加进返回数组。
代码:
private List<Integer> list = new ArrayList<>();
private void calc(TreeNode node, int now, int target) {
if (node == null) {
return;
}
if (now == target) {
list.add(node.val);
return;
}
calc(node.left, now + 1, target);
calc(node.right, now + 1, target);
}
public ListNode getTreeLevel(TreeNode root, int dep) {
if (dep == 1) {
return new ListNode(root.val);
}
calc(root, 1, dep);
if (list.size() > 0) {
ListNode node = new ListNode(list.get(0));
ListNode temp = node;
for (int i = 1; i < list.size(); ++i) {
temp.next = new ListNode(list.get(i));
temp = temp.next;
}
return node;
}
return null;
}