1. 问题描述:
Given a binary search tree, design an algorithm which creates a linked list of all the nodes at each depth(if you have a tree whith depth D, you're have D linked lists)
题目的意思是:给出一棵二叉树,以链表的形式返回二叉树的某一层的所有节点
2. 对树的操作无非是深度优先搜索和宽度优先搜索,由于涉及到的是树的层次,所以我们应该采用的是宽度优先搜索,使用宽搜的时候需要借助于队列来进行元素之间层次的处理,我们先要把树的根节点存到队列中,使用循环,当队列不为空的时候我们弹出一个节点,采用的策略是弹出一个节点如果左右节点不为空的情况下加入当前的左右节点,并且对弹出的节点进行层次上的判断,这里由于涉及到层高的问题所以可以对树节点进行封装,里面包括树的节点与当前节点的层高这两个属性,这样我们在压栈并且弹出栈的时候判断当前元素的层高是多少,假如层高满足题目中所给出的高度,那么创建链表的节点,把所有创建的节点连接起来即可
代码如下:
import java.util.LinkedList;
import java.util.Queue;
public class TreeLevel {
public static void main(String[] args) {
//以链表的形式返回BST中某一层的所有节点
TreeNode<Integer> root = new TreeNode<Integer>(1);
TreeNode<Integer> l = new TreeNode<Integer>(2);
TreeNode<Integer> r = new TreeNode<Integer>(3);
TreeNode<Integer> ll = new TreeNode<Integer>(4);
TreeNode<Integer> lr = new TreeNode<Integer>(5);
TreeNode<Integer> rl = new TreeNode<Integer>(6);
TreeNode<Integer> rr = new TreeNode<Integer>(7);
root.left = l;
root.right = r;
l.left = ll;
l.right = lr;
r.left = rl;
r.right = rr;
int depth = 3;
ListNode<Integer> head = getTreeLevel(root, depth);
ListNode<Integer> p = head;
while(p != null){
System.out.print(p.value + " ");
p = p.next;
}
}
//借助队列使用宽度优先搜索来解决
private static ListNode<Integer> getTreeLevel(TreeNode<Integer> root, int depth) {
Queue<NodeAndHeight> queue = new LinkedList<>();
queue.offer(new NodeAndHeight(root, 1));
ListNode<Integer> head = null;
ListNode<Integer> p = null;
while(!queue.isEmpty()){
NodeAndHeight poll = queue.poll();
if(poll.level == depth){
if(head == null){
head = new ListNode<Integer>(poll.node.val);
p = head;
}
else{
ListNode<Integer> newNode = new ListNode<Integer>(poll.node.val);
p.next = newNode;
p = p.next;
}
}else if(poll.level > depth){
break;
}
if(poll.node.left != null){
queue.offer(new NodeAndHeight(poll.node.left, poll.level + 1));
}
if(poll.node.right != null){
queue.offer(new NodeAndHeight(poll.node.right, poll.level + 1));
}
}
//返回链表的头结点
return head;
}
//将链表节点封装成为高度与节点的类
//也可以使用边遍历边检查的方法来解决
//class必须声明为static
private static class NodeAndHeight{
private TreeNode<Integer> node;
private int level;
NodeAndHeight(TreeNode<Integer> node, int level){
this.node = node;
this.level = level;
}
}
}
链表节点定义为:
public class ListNode<T> {
public ListNode<T> next;
public T value;
ListNode(T value){
this.value = value;
}
@Override
public String toString() {
return "ListNode [value=" + value + "]";
}
}