逐层遍历二叉树

题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

方法一:

利用递归方式,搜寻并打印某一层节点,再打印下一层节点

1.要逐层打印二叉树的节点,可以先实现打印该二叉树某一层的算法:

public void PrintNodeOfLevel(BinaryTree<int> root, int level){
    if(root == null || level < 0)
        return;
    if(level == 0)
        System.out.println(root.Data + "  ");
    if(root.Left != null)
        PrintNodeOfLevel(root.Left, level - 1);
    if(root.Right != null)
        PrintNodeOfLevel(root.Right, level - 1);
}

2.逐层打印需要知道二叉树的深度:

public int GetDepth(BinaryTree<int> root){
    int lDepth = 0,rDepth = 0;
    if(root == null)
        return 0;
    if(root.Left != null)
        lDepth = GetDepth(root.Left);
    if(root.Right != null)
        rDepth = GetDepth(root.Right);
    int temp = 0;
    if(lDepth >= rDepth)
        temp = lDepth;
    else
        temp = rDepth;
    return temp + 1;
}

3.最后逐层打印二叉树

public void PrintBTree(BinaryTree<T> root){
    int depth = GetDepth(root);
    for(int i = 0; i < depth; i++){
        PrintNodeOfLevel(root, i);
        System.out.println("\n");
    }
}

这是通过递归,比较耗时的做法,但不需要额外的空间

方法二:

利用队列,先将上层节点入队,节点出队的时候将其孩子节点入队,这样就可以达到按层入队出队的效果。
要打印某一层,可以在出队的时候一层一层的出,同时计算出队的次数,就可以判断出当前是哪一层
SouthEast
这里写图片描述

代码如下

public void printTree(BinaryTree<T> root){
    if(root == null)
        return;
    Queue<BinaryNode<T>> queue = new LinkedList<>();
        
    int current;//当前层 还未打印的结点个数
    int next;//下一层结点个数
        
    queue.offer(root);
    current = 1;
    next = 0;
    while(!queue.isEmpty()){
        Node<T> currentNode = queue.poll();
        System.out.printf("%-4d", currentNode.element);
        current--;
                
        if(currentNode.left != null){
            queue.offer(currentNode.left);
            next++;
        }
        if(currentNode.right != null){
            queue.offer(currentNode.right);
            next++;
        }
        if(current ==0){
            System.out.println();
            current = next;
            next = 0;
        }
    }
}

转载于:https://www.cnblogs.com/gcoder/p/7507057.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值