java实现二叉树的相关操作

 今天再看数据结构的二叉树,顿时感觉世界明亮了。就写了这个,当然了,这个呢。也是看网上的方法的。

非常感谢下面几篇文章的作者。

https://www.cnblogs.com/ysocean/p/8032642.html#_label0_0

https://www.cnblogs.com/lixiaolun/p/4658659.html

https://blog.csdn.net/u010842515/article/details/68951783

 下面就列出方法。

package com.tree;

import java.util.LinkedList;

/**
 * @author SunY
 * 实现二叉树的相关运算,继承我的的Tree
 * */
public class BinaryTree implements Tree{

    public BinaryTree(){ }
    /**
     * @param data
     * 建议使用泛型
     * */
    @Override
    public LinkedList<Node> createTree(int[] data) {
        LinkedList<Node> nodeLinkedList = null ; // 链表
        // 将数组的值一次转化成二叉树的节点值
        nodeLinkedList = new LinkedList<Node>();
        for(Object element : data){
            nodeLinkedList.add(new Node(element));
        }
        /**
         * * 完全二叉树中第i层的结点的个数最多为第1到i-1层上所有节点的个数和
         * * 所以父节点的个数最多为N-1个,N表示节点个数
         * */
        for(int parentIndex = 0 ; parentIndex < data.length / 2 - 1 ; parentIndex ++ ){
            // 根节点为空,即为空表时
            nodeLinkedList.get(parentIndex).leftChild =
                    nodeLinkedList.get(parentIndex*2 + 1);
            nodeLinkedList.get(parentIndex).rightChild =
                    nodeLinkedList.get(parentIndex*2 + 2);
            // 左 , 右 孩子 , 这个可能好理解一点
            //root.leftChild = new Node(array[parentIndex*2 + 1]) ;
            //root.rightChild = new Node(array[parentIndex*2 + 2]);
        }
        // 上面我们解决了前面的所有节点,但是我们的最后一个父节点,还没有处理,万一他们有孩子呢?
        int lastparentIndex = data.length / 2 - 1 ;
        nodeLinkedList.get(lastparentIndex).leftChild =
                nodeLinkedList.get(lastparentIndex*2 + 1);
        // 此时,我们需要注意一下,如果没有右孩子,怎么办?如果数组的长度为奇数才建立右孩子
        if(data.length % 2 == 1 ){
            nodeLinkedList.get(lastparentIndex).rightChild =
                    nodeLinkedList.get(lastparentIndex*2 + 2);
        }
        return nodeLinkedList;
    }

    /**
     * @param data
     * */
    @Override
    public boolean insertTree(Object data,LinkedList<Node> nodelist) {
        return false;
    }
    /**
     * @param data
     * */
    @Override
    public boolean deleteTree(Object data) {
        return false;
    }
    /**
     * @param node
     * */
    @Override
    public void visit(Node node) {
        if(node != null){
            System.out.print(node.data+" ");
        }
    }
    /**
     * @param node
     * 左序遍历
     * */
    @Override
    public void INOrderTraverse(Node node) {
        if(node == null )
            return ;
        INOrderTraverse(node.leftChild);
        visit(node);
        INOrderTraverse(node.rightChild);
    }
    /**
     * @param node
     * 先序遍历
     * */
    @Override
    public void PreOrderTraverse(Node node) {
        if(node == null )
            return ;
        visit(node);
        PreOrderTraverse(node.leftChild);
        PreOrderTraverse(node.rightChild);
    }
    /**
     * @param node
     * 后序遍历
     * */
    @Override
    public void PostOrderTraverse(Node node) {
        if(node == null )
            return ;
        PostOrderTraverse(node.leftChild);
        PostOrderTraverse(node.rightChild);
        visit(node);
    }
}
package com.tree;
/**
 * @author SunY
 * 二叉树的定义类
 * */
public class Node {

    public Object data ; // 节点数据
    public  Node leftChild ;// 左孩子节点
    public  Node rightChild ;// 右孩子节点
    public  Node(Object data){
        this.leftChild = null ;
        this.rightChild = null ;
        this.data = data ;
    }
    @Override
    public String toString() {
        return "Node{" +
                "data=" + data +
                ", leftChild=" + leftChild +
                ", rightChild=" + rightChild +
                '}';
    }

}
package com.tree;

import java.util.LinkedList;
/**
 * @author SunY
 * 定义操作树方法接口
 *
 * */
public interface Tree {
    // 创建一个二叉树
    public LinkedList<Node> createTree(int[] data);
    // 插入
    public boolean insertTree(Object data ,LinkedList<Node> nodelist) ;
    // 删除
    public boolean deleteTree(Object data);
    // 输出二叉树
    public void visit(Node node) ;

    // 左序遍历
    public void INOrderTraverse(Node node);
    // 先序遍历
    public void PreOrderTraverse(Node node);
    //后序遍历
    public void PostOrderTraverse(Node node);

}
package com.tree.test;

import com.tree.BinaryTree;
import com.tree.Node;

import java.util.LinkedList;
/**
 * @author SunY
 * 二叉树的测试
 * */
public class BinaryTreeTest {
    private Node root = null , node = null ;

    private int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 自定义一个数组

    @org.junit.Test
    public void BinaryTest(){
        BinaryTree binaryTree = new BinaryTree();
        LinkedList<Node> nodelist = binaryTree.createTree(array) ; // 这里的数组可以替换成其他的Object类型,得到一个二叉树链表
        root = nodelist.get(0); // 得到根节点
        System.out.println("构建的二叉树为:");
        for(Node list : nodelist){
            System.out.println(list.toString());
        }

        System.out.println("先序遍历");
        binaryTree.PreOrderTraverse(root);
        System.out.println();
        System.out.println("中序遍历");
        binaryTree.INOrderTraverse(root);
        System.out.println();
        System.out.println("后序遍历");
        binaryTree.PostOrderTraverse(root);

    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值