java创建完全二叉树

使用java创建完全二叉树

什么是完全二叉树?

对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

创建步骤:

  1. 每添加一个结点就将节点的放到父结点下
  2. 结点添加的顺序是从上到下,从左到右

这里使用队列来添加节点。

队列中存储的是:左孩子或者右孩子指针为null的节点。且队列的队首元素是下次要添加的新节点的父节点,当这个父节点的左右孩子指针都不为null时,即父节点左右孩子都存在时,父节点出队。

过程:

部分代码

    //这里设置TreeNode为内部类:二叉树的存储结构
    private class TreeNode{
        private T data;//数据域
        private TreeNode left;//左孩子指针
        private TreeNode right;//右孩子指针

        public TreeNode(T data){
            this.data=data;
        }
    }
    /**
     * 利用队列创建二叉树
     * @param data
     */
    public void add(T data){
        if(this.root==null){
            this.root=new TreeNode(data);
            dequee.add(this.root);
        }else{
            if(!dequee.isEmpty()){
                TreeNode node = dequee.getFirst();
                if(node.left==null){
                    node.left=new TreeNode(data);
                    dequee.add(node.left);
                } else{
                    //左子树不为空,直接操作右子树
                    node.right=new TreeNode(data);
                    dequee.add(node.right);
                    //这时左右子树都不为空了,当前节点出队
                    dequee.pollFirst();
                }
            }
        }
    }

完整代码:

package stu1;

import java.util.LinkedList;

public class 普通二叉树 {
    public static void main(String[] args) {
        MyTree1<String> mytree=new MyTree1<>();
        mytree.add("A");
        mytree.add("B");
        mytree.add("C");
        mytree.add("D");
        mytree.add("E");
        mytree.add("F");

        //先序遍历输出节点
        mytree.printNode();
    }
}

//二叉树类
class MyTree1<T>{

    //TreeNode是内部类:二叉树的存储结构
    private class TreeNode{
        private T data;//数据域
        private TreeNode left;//左孩子指针
        private TreeNode right;//右孩子指针

        public TreeNode(T data){
            this.data=data;
        }
    }

    private TreeNode root;//根节点
    private LinkedList<TreeNode> dequee=new LinkedList<>();//队列

    /**
     * 利用队列创建二叉树
     * @param data
     */
    public void add(T data){
        if(this.root==null){
            this.root=new TreeNode(data);
            dequee.add(this.root);
        }else{
            if(!dequee.isEmpty()){
                TreeNode node = dequee.getFirst();
                if(node.left==null){
                    node.left=new TreeNode(data);
                    dequee.add(node.left);
                } else{
                    //左子树不为空,直接操作右子树
                    node.right=new TreeNode(data);
                    dequee.add(node.right);
                    //这时左右子树都不为空了,当前节点出队
                    dequee.pollFirst();
                }
            }
        }
    }

    public void printNode(){
        TreeNode p=this.root;
        print(p);
    }
    //先序遍历输出
    private void print(TreeNode p){
        if(p!=null){
            System.out.println(p.data);
            print(p.left);
            print(p.right);
        }
    }

    public MyTree1(){}//无参构造方法

}

演示:

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
创建完全叉树,可以使用队列来辅助构建。下面是一个示例的Java代码: ```java // 设置TreeNode为内部类:二叉树的存储结构 private class TreeNode { private T data; // 数据域 private TreeNode left; // 左孩子指针 private TreeNode right; // 右孩子指针 public TreeNode(T data) { this.data = data; } } /** * 利用队列创建完全叉树 * @param data 节点数据 */ public void add(T data) { if (this.root == null) { this.root = new TreeNode(data); queue.add(this.root); } else { if (!queue.isEmpty()) { TreeNode node = queue.peek(); if (node.left == null) { node.left = new TreeNode(data); queue.add(node.left); } else { // 左子树不为空,直接操作右子树 node.right = new TreeNode(data); queue.add(node.right); // 这时左右子树都不为空了,当前节点出队 queue.poll(); } } } } ``` 上述代码中,首先定义了一个内部类TreeNode,表示二叉树的节点。接着,使用add方法来逐个添加节点,这里使用队列queue来辅助构建完全叉树。当树为空时,直接创建根节点,并将根节点加入队列。否则,从队列中取出第一个节点,并判断其左子树是否为空。若为空,创建左子节点,并将其加入队列。若左子树不为空,直接操作右子树,并将右子节点加入队列。最后,当左右子树都不为空时,将当前节点出队。完成所有节点的添加后,即可得到一个完全叉树。 请注意,这只是一个示例的实现方法,具体的实现可能会根据需求而有所变化。如果有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值