JD4.4树—输出单层节点

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

方法2思路:
要获取指定深度的节点,只需在二叉树的先序遍历过程中加上深度值即可。
由于先序遍历是先访问左孩子、再访问右孩子,所以某一层的左孩子一定先访问到,右孩子一定后访问到。
代码:
1、只要在先序遍历函数上加上两个参数即可:
2、当前深度;
目标深度 若当前深度和目标深度一致时,将当前节点输出,并直接return回溯,无需再往下递归了!节约一定的开销!
package jindian;
/* class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}
class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}*/
public class TreeLevel {
//方法1:采用dep--的方法,很是巧妙
    ListNode head =new ListNode(-1);
    ListNode cur= head;
    public ListNode getTreeLevel(TreeNode root, int dep) {
        if(root==null||dep<0)
            return null;
        if(dep==1){//说明已经遍历到第dep层,加入到链表
            cur.next=new ListNode(root.val);
            cur=cur.next;
        }else{//加上else,如果dep==1,则不用执行else,节约开销.如果不加else,也可以在if最后加上return
            getTreeLevel(root.left,dep-1);//遍历左子树,并将左子树中第dep层加入到链表
            getTreeLevel(root.right,dep-1);//遍历右子树,并将右子树中第dep层加入到链表
        }
        return head.next;
    }

//方法2:在先序遍历基础,加上当前深度和目标深度这两个参数,当前深度++直到等于目标深度,构建链表
    /*ListNode head =new ListNode(-1);
    ListNode cur= head;*/
   public ListNode getTreeLevel(TreeNode root,int dep){
       if(root==null||dep<0)
           return null;
       preOrder(root,1,dep);
       return head.next;
   }
   private void preOrder(TreeNode root,int curDep,int dep){
       if(root==null)
           return;
       if(curDep==dep){
           cur.next=new ListNode(root.val);
           cur=cur.next;
           return;
       }
       preOrder(root.left,curDep+1,dep);//curDep++直到第dep层
       preOrder(root.right,curDep+1,dep);
   }
}

猜你喜欢

转载自blog.csdn.net/hefenglian/article/details/80564524
4.4
今日推荐