程序员面试金典-4.4 输出单层节点

一、题目描述

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

二、解题思路

1. 如上图所示,如果说4,5,6,7这一层是待求的高度,节点2会接收到来自左子树4和右子树5的返回结果,在节点2这个地方既要记录节点4返回的头节点,又要求出节点4返回链表的尾节点(如果节点4还有左右子树),因为要让尾节点的下一个指向5返回的链表的首节点,然后将整串链表返回给上一层,上一层也是同样的处理方式。

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 {
    public ListNode getTreeLevel(TreeNode root, int dep) {
        // write code here
        if(root==null || dep<0)
            return null;
        ListNode result;
        if(dep==1)
            result=new ListNode(root.val);
        else{
            result=getTreeLevel(root.left,dep-1);
            ListNode cur=result;
            while(cur!=null && cur.next!=null){//将cur指针移动到尾节点
                cur=cur.next;
            }
            if(cur==null)
                result=getTreeLevel(root.right,dep-1);
            else
                cur.next=getTreeLevel(root.right,dep-1);
        }
        return result;
            
    }
}

简单一点的做法

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 result=new ListNode(0);
    ListNode cur=result;
    public ListNode getTreeLevel(TreeNode root, int dep) {
        // write code here
        if(root==null || dep<0)
            return null;
        if(dep==1){
            cur.next=new ListNode(root.val);
            cur=cur.next;
        }else{
            getTreeLevel(root.left,dep-1);
            getTreeLevel(root.right,dep-1);
        }
        return result.next;
            
        
        /*
        if(root==null || dep<0)
            return null;
        ListNode result;
        if(dep==1)
            result=new ListNode(root.val);
        else{
            result=getTreeLevel(root.left,dep-1);
            ListNode cur=result;
            while(cur!=null && cur.next!=null){
                cur=cur.next;
            }
            if(cur==null)
                result=getTreeLevel(root.right,dep-1);
            else
                cur.next=getTreeLevel(root.right,dep-1);
        }
        return result;
            */
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值