二叉树的Java实现

import java.util.LinkedList;
import java.util.List;


public class BinaryTree{

    private TreeNode root;

    public BinaryTree(){}
    public BinaryTree(TreeNode root){
        this.root = root;
    }
    public TreeNode getRoot(){
        return root;
    }
    public void setRoot(TreeNode root){
        this.root = root;
    }

    /**
     * create tree
     */
    public void creatTree(int[] datas,List<TreeNode> nodeList){
        for(int nodeIndex=0;nodeIndex<datas.length;nodeIndex++){
            TreeNode node = new TreeNode(datas[nodeIndex]);
            nodeList.add(node);
        }

        for(int index=0;index<(datas.length)/2-1;index++){
            nodeList.get(index).setLeft(nodeList.get(index*2+1));
            nodeList.get(index).setRight(nodeList.get(index*2+2));
        }
        int index = datas.length/2-1;
        nodeList.get(index).setLeft(nodeList.get(index*2+1));
        if(datas.length%2==1){
            nodeList.get(index).setRight(nodeList.get(index*2+2));
        }
    }

    /**
     * node count
     */
    public int getSize(){
        return getSize(root);
    }
    private int getSize(TreeNode node){
        if(node==null){
            return 0;
        }else{
            int i=getSize(node.getLeft());
            int j=getSize(node.getRight());
            return i+j+1;
        }
    }

    /**
     * leaf cuont
     */
    public int getLeaf(TreeNode root){
        int leafCount = 0;
        if(root==null){
            return 0;
        }else{
            if((!root.hasLeft())&&(!root.hasRight())){
                leafCount++;
            }
        }
        int i = getLeaf(root.getLeft());
        int j = getLeaf(root.getRight());
        return i+j+leafCount;
       
    }

    /**
     * tree height
     */
    public int getHeight(){
        return getHeight(root);
    }
    private int getHeight(TreeNode node){
        if(node==null){
            return 0;
        }else{
            int i=getHeight(node.getLeft());
            int j=getHeight(node.getRight());
            return (i<j)?(j+1):(i+1);
        }
    }

    /**
     * preOrder
     */
    public void preOrder(TreeNode node){
        if(node!=null){
            System.out.print(node.getData()+" ");
            preOrder(node.getLeft());
            preOrder(node.getRight());
        }
    }

    public void nonRecurPreOrder(TreeNode root){
        LinkedList<TreeNode> stack =new LinkedList<>();
        TreeNode currentNode = root;
        TreeNode temp;
        while(currentNode!=null||!stack.isEmpty()){
            while(currentNode!=null){
                System.out.print(currentNode.getData()+" ");
                stack.push(currentNode);
                currentNode=currentNode.getLeft();
            }
            if(!stack.isEmpty()){
                temp=stack.pop();
                currentNode=temp.getRight();
            }
            
        }
        System.out.println();
    }
    /**
     * inOrder
     */
    public void inOrder(TreeNode node){
        if(node!=null){
            inOrder(node.getLeft());
            System.out.print(node.getData()+" ");
            inOrder(node.getRight());
        }
    }

    public void nonRecurInOrder(TreeNode root){
        LinkedList<TreeNode> stack = new LinkedList<>();
        TreeNode currentNode = root;
        TreeNode temp;
        while(currentNode!=null||!stack.isEmpty()){
            while(currentNode!=null){
                stack.push(currentNode);
                currentNode=currentNode.getLeft();
            }
            if(!stack.isEmpty()){
                temp=stack.pop();
                System.out.print(temp.getData()+" ");
                currentNode=temp.getRight();
            }
        }
        System.out.println();
    }
    /**
     * postOrder
     */
    public void postOrder(TreeNode node){
        if(node!=null){
            postOrder(node.getLeft());
            postOrder(node.getRight());
            System.out.print(node.getData()+" ");
        }
    }

    public void nonRecurPostOrder(TreeNode root){
        LinkedList<TreeNode> stack = new LinkedList<>();
        TreeNode currentNode = root;
        TreeNode prevNode = root;
        while(currentNode!=null||!stack.isEmpty()){
            while(currentNode!=null){
                stack.push(currentNode);
                currentNode=currentNode.getLeft();
            }
            if(!stack.isEmpty()){
                TreeNode temp = stack.peek().getRight();
                if(temp==null||temp==prevNode){
                    currentNode=stack.pop();
                    System.out.print(currentNode.getData()+" ");
                    prevNode=currentNode;
                    currentNode=null;
                }else{
                    currentNode=temp;
                }
            }
        }
        System.out.println();
    }

    public static void main(String[] args) {

        BinaryTree tree = new BinaryTree();
        int[] datas=new int[]{1,2,3,4,5,6,7,8,9};
        List<TreeNode> nodeList = new LinkedList<>();
        tree.creatTree(datas, nodeList);
        TreeNode root = nodeList.get(0);

        System.out.println("\n=====preOrder======");
        tree.preOrder(root);
        System.out.println("\n=====non pre order======");
        tree.nonRecurPreOrder(root);
        System.out.println("\n=====inOrder=======");
        tree.inOrder(root);
        System.out.println("\n=====non in order======");
        tree.nonRecurInOrder(root);   
        System.out.println("\n=====postOrder=====");
        tree.postOrder(root);
        System.out.println("\n=====non post order======");
        tree.nonRecurPostOrder(root);
        System.out.println("\n=====height=======");
        System.out.println(tree.getHeight(root));
        System.out.println("\n=====size=========");
        System.out.println(tree.getSize(root));
        System.out.println("\n=====leaf=========");
        System.out.println(tree.getLeaf(root));


    }



}
class TreeNode{
    private int data;
    private TreeNode left;
    private TreeNode right;
    public TreeNode(){}
    public TreeNode(int data){
        this.data=data;
        this.left=null;
        this.right=null;
    }
    public TreeNode(int data,TreeNode left,TreeNode right){
        this.data=data;
        this.left=left;
        this.right=right;
    }

    public int getData(){
        return data;
    }
    public void setData(int data){
        this.data = data;
    }
    public TreeNode getLeft(){
        return left;
    }
    public void setLeft(TreeNode left){
        this.left = left;
    }
    public TreeNode getRight(){
        return right;
    }
    public void setRight(TreeNode right){
        this.right = right;
    }

    public boolean hasLeft(){
        if(this.getLeft()==null)
            return false;
        return true;
    }
    public boolean hasRight(){
        if(this.getRight()==null)
            return false;
        return true;
    }
}

按层遍历java

 public void laywerOrder(TreeNode root){
        if(root==null)
            return ;
        LinkedList<TreeNode> list = new LinkedList<>();
        list.add(root);
        TreeNode currentNode = root;
        while(!list.isEmpty()){
            currentNode=list.poll();
            System.out.print(currentNode.getData()+" ");
            if(currentNode.hasLeft())
                list.add(currentNode.getLeft());
            if(currentNode.hasRight())
                list.add(currentNode.getRight());
        }
    }

输出:node

=====layer order======
1 2 3 4 5 6 7 8 9

 

结果:post

 

=====preOrder======
1 2 4 8 9 5 3 6 7
=====non pre order======
1 2 4 8 9 5 3 6 7

=====inOrder=======
8 4 9 2 5 1 6 3 7
=====non in order======
8 4 9 2 5 1 6 3 7

=====postOrder=====
8 9 4 5 2 6 7 3 1
=====non post order======
8 9 4 5 2 6 7 3 1

=====height=======
4

=====size=========
9

=====leaf=========
5