二叉树层序遍历+深度计算+节点计算、叶子节点计算

二叉树

前序、中序、后序遍历(递归+非递归)

层序遍历

public void levelTraversal(TreeNode root) {
     
    //存放节点值输出
    ArraryList<Integer> list = new ArrayList<Integer>();
    if(root==null)
        return;
    //队列先进先出
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    // 先放入根节点
    queue.add(root);
    while(!queue.isEmpty){
     
        //每拿出一个节点,判断是否有左右节点放入队列
        TreeNode node = queue.poll();
        //拿出的节点值存入
        list.add(node.data);
        if(node.left!=null)
            queue.add(node.left);
        if(node.right!=null)
            queue.add(node.right);
    }
    //输出
    for (int i=0;i<list.size();i++){
     
            System.out.print(list.get(i)+" ");
        }
}

深度

public int depth(TreeNode root){
     
    if (root==null){
     
        return  0;
    }
    else{
     
        int leftNum = depth(root.left);
        int rightNum = depth(root.right);
        return Math.max(leftNum,rightNum)+1;
    }
}

判断是否为叶子节点

public boolean isLeaves(TreeNode root){
     
    return  node.left==null&&node.right==null;
}

节点个数(递归)

计算节点个数可用各种遍历
public int numNode(TreeNode root){
     
    if(root==null){
     
        return 0;
    }
    //计入当前节点  
    int n = 1;
    //如果为叶子节点则返回n=1
    if(isLeaves(root)){
     
        return n;
    }
    //叠加递归计算的子节点数
    n+=numNode(root.left);
    n+=numNode(root.right);
    return n;
}

叶子节点个数

public numLeaves(TreeNode root){
     
    //如果不为空则进入叶节点计算
    return root!=null?num(root):0;
}
public int num(TreeNode node){
     
    int n=0;
    // 如果不是叶子节点继续递归否则+1
    if(node.left!=null){
     
        n+=isLeaves(node.left)?1:num(node.left);
    }
    if(node.right!=null){
     
        n+=isLeaves(node.right)?1:num(node.right);
    }
    return n;
}

你可能感兴趣的:(二叉树,数据结构,java)