数据结构之二叉树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 }
加油