数据结构之二叉树java实现

二叉树是一种非线性数据结构,属于树结构,最大的特点就是度为2,也就是每个节点只有一个左子树和一个右子树。二叉树的操作主要为创建,先序遍历,中序遍历,后序遍历。还有层次遍历。遍历有两种方式,一是采用递归的方式,二是采用转换为栈进行遍历,对二叉树的遍历本质上市将非线性结构转换为线性序列。

  1 package tree;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 import java.util.Queue;
  6 
  7 //通过先序方式将数组依次添加到二叉树
  8 public class CreateTreeByArray<E> {
  9     public static class Node<E>{
 10         Node<E> left = null;  //左子树
 11         Node<E> right = null; //右子树
 12         E data = null;          //数据域
 13         
 14         //初始化节点
 15         public Node(E data){
 16             this.data = data;
 17             this.left = null;
 18             this.right = null;
 19         }
 20         
 21         public Node(){
 22             
 23         }
 24     }
 25     private Node<E> root = null; //根节点
 26     private List<Node<E>> list = null; //节点列表,用于将数组元素转化为节点
 27     
 28     public Node<E> getRoot(){
 29         return this.root;
 30     }
 31     
 32     //将将数组转化为一颗二叉树,转换规则:依次为节点列表中节点的左右孩子赋值。左孩子为i*2+1,右孩子为i*2+2
 33     @SuppressWarnings("unchecked")
 34     public void createTreeByArray(Object[] array){
 35         this.list = new ArrayList<Node<E>>();
 36         
 37         //将数组添加到节点列表
 38         for (int i = 0; i < array.length; i++) {
 39             list.add(new Node<E>((E) array[i]));
 40         }
 41         
 42         System.out.println("头节点->" + list.get(0).data);
 43         this.root = new Node<E>(list.get(0).data); //根节点
 44         
 45         //为二叉树指针赋值
 46         for(int j = 0; j < (list.size() / 2); j ++){
 47             try {
 48                 //为左子树赋值  j*2+1
 49                 list.get(j).left = list.get(j * 2 + 1);
 50                 System.out.println("节点" + list.get(j).data + "左子树 ->" + list.get(j * 2 + 1).data);
 51                 //为右子树赋值 j*2+2
 52                 list.get(j).right = list.get(j * 2 + 2);
 53                 System.out.println("节点" + list.get(j).data + "右子树 ->" + list.get(j * 2 + 2).data);
 54             } catch (Exception e) {
 55                 
 56             }
 57         }
 58         
 59     }
 60     
 61     //先序遍历二叉树
 62     public void Indorder(Node<E> root){
 63         if(root == null){
 64             return;
 65         }
 66         System.out.println(root.data);
 67         Indorder(root.left);  //递归输出左子树
 68         Indorder(root.right); //递归遍历右子树
 69     }
 70     
 71     //中序遍历二叉树
 72     public void inOrderTraverse(Node<E> root){
 73         if(root == null){
 74             return;
 75         }
 76         inOrderTraverse(root.left);  //遍历左子树
 77         System.out.println(root.data);
 78         inOrderTraverse(root.right); //遍历右子树
 79     }
 80     
 81     //后序遍历
 82     public void postOrderTraverse(Node<E> root){
 83         if(root == null){
 84             return;
 85         }
 86         postOrderTraverse(root.left);  //遍历左子数节点
 87         postOrderTraverse(root.right); //遍历右子树节点
 88         System.out.println(root.data); //从下往上遍历
 89     }
 90         
 91     
 92     public static void main(String[] args) {
 93         CreateTreeByArray<Integer> createTreeByArray = new CreateTreeByArray<Integer>();
 94         Object[] arrays = {new Integer(1),new Integer(2),new Integer(3),new Integer(4),5,6,7,8,9,10};
 95         createTreeByArray.createTreeByArray(arrays);
 96         System.out.println("===============================");
 97         createTreeByArray.postOrderTraverse(createTreeByArray.list.get(0));
 98     
 99     }
100 
101 }
原文地址:https://www.cnblogs.com/liaohai/p/6523069.html