二叉树的层级遍历 java

本文介绍了两种Java实现二叉树层次遍历的方法。第一种利用两个队列q1和q2,节点入队和出队策略确保了层次顺序。第二种方法使用一个数组,通过双指针head和end动态调整数组大小,实现层次遍历。
摘要由CSDN通过智能技术生成

在这里我将写出两种二叉树便利的方法
第一种,是基于两个队列q1,q2,将当前节点放在q1,子节点放在q2,然后将q1出队列。然后再将q2的复制到q1。再继续执行。这样,每次只有q1在出队列输出,每次输出的都是按照书序的

第二种 基于一个数组。有两个指针,一个指向头部head,一个指向尾部的end。让head指针往结尾跑,而end指针始终指向数组的末尾。如果有了新的子节点,就往数组中增加。所以,始终,这两个指针都是运动的。

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * Created by yangrui on 2017/2/7.
 */
public class TreeNode {
    private int value;

    public int getValue() {
        return value;
    }

    /**
     * 左子树
     */
    private TreeNode tl;
    /**
     * 右子树
     */
    private TreeNode tr;

    public TreeNode(int value) {
        this.value = value;
    }

    public TreeNode() {
    }

    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        TreeNode node2 = new TreeNode(2);
        TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(4);
        TreeNode node5 = new TreeNode(5);
        TreeNode node6 = new TreeNode(6);
        TreeNode node7 = new TreeNode(7);
        TreeNode node8 = new TreeNode(8);

        root.tl = node2;
        root.tr = node3;

        node2.tl = node4;
        node2.tr = node5;

        node3.tr = node6;

        node5.tl = node7;
        node5.tr = node8;

        root.traversal2(root);

    }


    public void traversal2(TreeNode node) {
        Queue<TreeNode> q1 = new LinkedList<>();
            Queue<TreeNode> q2 = new LinkedList<>();
            q1.add(node);
            while (!q1.isEmpty()) {
                    while (!q1.isEmpty()) {
                            TreeNode temp = q1.poll();
                            System.out.println(temp.getValue());

                            if (temp.tl!=null){
                                    q2.add(temp.tl);
                                }
                            if (temp.tr!=null){
                                    q2.add(temp.tr);
                                }
                        }
                    Queue<TreeNode> temp = new LinkedList<>();
                    temp=q1;
                    q1=q2;
                    q2=temp;

                }
        }


    public void traversal(TreeNode node) {
        if (node==null){
            return;
        }
        int head=0;
        int end = 0;

        List<TreeNode> list =new ArrayList<>();
        list.add(node);
        System.out.println(node.getValue());

        while (head<list.size()){
            end=list.size();
            while (head<end){
                if (list.get(head).tl!=null){
                    list.add(list.get(head).tl);
                }
                if (list.get(head).tr!=null){
                    list.add(list.get(head).tr);
                }
                head++;
            }
        }

    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值