使用java创建完全二叉树
什么是完全二叉树?
对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
创建步骤:
- 每添加一个结点就将节点的放到父结点下
- 结点添加的顺序是从上到下,从左到右
这里使用队列来添加节点。
队列中存储的是:左孩子或者右孩子指针为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(){}//无参构造方法
}
演示: