《程序员面试金典》输出单层节点

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

解析:该题目考察的知识点较多,有层次遍历法求树的深度,并且还考察了单链表的创建。但是我们逐个击破的话,该题目只是把多个知识点融合在一起,并不难。解题思想就是用队列来层次遍历二叉树,然后用集合list记录每一层遍历出来的节点值,当达到某一深度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) {
        ListNode head =null;//单链表表头
        Queue<TreeNode> queue = new LinkedList<>();//队列,层次遍历二叉树的节点的时候保存节点信息
        List<Integer> list = new ArrayList<>();//存储一层的节点信息,
        if(root==null){
            return head;
        }
        queue.add(root);
        int current =1;//当前层的节点数
        int next=0;//下一层的节点数
        int level=0;//记录层次遍历的深度
        while (!queue.isEmpty()){
            TreeNode node = queue.poll();
            list.add(node.val);
            current--;
            if(node.left!=null){
                queue.add(node.left);
                next++;
            }
            if(node.right!=null){
                queue.add(node.right);
                next++;
            }
            if(current==0){
                level++;
                if(level==dep){//已经遍历到所需要的深度了
                    break;
                }
                current=next;
                next=0;
                list = new ArrayList<>();//没有到需要的深度,需要继续重新创建list收集下一层的节点信息
            }
        }
        head = new ListNode(list.get(0));//注意一般的题目head都带值的
        for(int i=list.size()-1;i>=1;i--){//头插法创建单链表返回
            ListNode node = new ListNode(list.get(i));
            node.next=head.next;
            head.next=node;
        }
        return head;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值