二叉树:输出单层结点

1、题目内容

输出单层结点
 
题目描述
对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表。
给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。

2、题目解析

就是将二叉树的某一层K上的节点保存到链表中。

思路1:将二叉树按层序遍历,当遍历到指定层时,将该层的节点保存到链表中。

       这个题目的意思就是输出二叉树的某一层的所有元素,这个首先想到的是层次遍历,层次遍历最简单的方法就是用队列实现,我们传统的层次遍历方法是可以输出所有元素,那么如何区分相邻两层之间的元素呢?  
       其实我们可以用两个整数变量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:递归求解

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;
    }
}


转载于:https://my.oschina.net/u/2444659/blog/663825

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值