一、题目内容java
输出单层结点 题目描述 对于一棵二叉树,请设计一个算法,建立含有某一深度上全部结点的链表。 给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,表明该深度上全部结点的值,请按树上从左往右的顺序连接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。
二、题目解析node
就是将二叉树的某一层K上的节点保存到链表中。算法
思路1:将二叉树按层序遍历,当遍历到指定层时,将该层的节点保存到链表中。this
这个题目的意思就是输出二叉树的某一层的全部元素,这个首先想到的是层次遍历,层次遍历最简单的方法就是用队列实现,咱们传统的层次遍历方法是能够输出全部元素,那么如何区分相邻两层之间的元素呢?
其实咱们能够用两个整数变量line1,line2来记录相邻两层的元素个数,其中line1表明出队那一层留下的元素个数,line2表明下一层入队元素的个数,每当line1为0的时候,说明上一层已经所有出栈,下一层已经所有入栈,那么层次遍历层数num就加一,这个时候将line2的值复制给line1,line2=0,当遍历到第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) { // write code here if(root==null||dep<=0){ return null; } ListNode node = new ListNode(-1); ListNode nodeHead = node; Queue<TreeNode> queue = new LinkedList<TreeNode>();//队列实现层序遍历 queue.add(root); int line1 = 1;//当前层出队的节点数 int line2=0;//下一层入队的节点数 int num=1;//便利层数 while(!queue.isEmpty()){ if(num==dep){//当遍历的层数与指定的层数相等时,将该层节点保存到链表中并返回, for(int i=0;i<line1;i++){ TreeNode root1 = queue.peek(); node.next = new ListNode(root1.val); node = node.next; queue.poll(); } return nodeHead.next; } TreeNode root1 = queue.peek(); if(root1.left!=null){ queue.add(root1.left); line2++; } if(root1.right!=null){ queue.add(root1.right); line2++; } queue.poll(); if(--line1==0){ line1 = line2; line2 = 0; num++; } } return nodeHead.next; } }
思路2:递归求解code
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 { ListNode node = new ListNode(-1); ListNode p = node; public ListNode getTreeLevel(TreeNode root, int dep) { // write code here if(root==null||dep<=0){ return null; } if(dep==1){ p.next = new ListNode(root.val); p = p.next; }else{ getTreeLevel(root.left, dep-1); getTreeLevel(root.right, dep-1); } return node.next; } }