求BST某一层的所有节点

ListNode实现

class ListNode<V>{
	V value;
	ListNode next;
	public ListNode(V value){
		this.value=value;
}	
@Override
public String toString(){
	ListNode p=next;
	StringBuilder sb=new StringBuilder("["+value+"");
	while(p!=null){
		sb.append(p.value+(p.next==null?"":","));
		p=p.next;
	}
	sb.append("]");
	return sb.toString();
}
}

TreeNode

class TreeNode<V>{
	V value;
	TreeNode left=null;
	TreeNode right=null;
	public TreeNode(V value){
		this.value=value;
	}
}

NodeAndHeight
为便于知道节点层次,需要一个既有树节点又有层次的方法

class NodeAndHeight{
	TreeNode<Integer>node;
	int height;
	public NodeAndHeight(TreeNode<Integer>node,int height){
			this.node=node;
			this.height=height;
	}
}

主方法

public class Main{
	public ListNode getTreeLevel(TreeNode root,int height){
		if(root!=null&&height==1)return new ListNode(root.value);//根高度为1只有一层
		if(root==null)return null;//根为空
			ListNode head=null;
			ListNode last=null;
			Queue<NodeAndHeight>queue=new LinkedList();//队列
			queue.offer(new NodeAndHeight(root,1));//头节点入队
			while(queue!=null){//队列不为空
					NodeAndHeight poll=queue.poll();//弹出队
					//满足要求的层次加入链表中
					if(poll.height==height){
						if(head==null){//头节点为空
							head=new ListNode(root.value);
							last=head;
						}else{
							last.next=new ListNode(root.value);
							last=last.next;
						}
					}else if(poll.height>height){
							break;
						}
						if(poll.left!=null&&poll.height<height){//左子入队
							queue.offer(new NodeAndHeight(poll.left,1+poll.height));
						}
						if(poll.right!=null&&poll.height<height){//右子入队
							queue.offer(new NodeAndHeight(poll.right,1+poll.height));
						}
			}
			return head;
}
//测试
public static void main(String[] args) {
		TreeNode node=new TreeNode(1);
		TreeNode node2=new TreeNode(2);
		TreeNode node3=new TreeNode(3);
		TreeNode node4=new TreeNode(4);
		TreeNode node5=new TreeNode(5);
		node.left=node2;
		node.right=node3;
		node2.left=node4;
		node3.right=node5;
		ListNode list=new Main().getTreeLevel(node, 3);//打印输出第三层所有节点
		System.out.println(list);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹏之翼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值