一、題目內容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; } }