二叉樹:輸出單層結點

一、題目內容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;
    }
}
相關文章
相關標籤/搜索