二叉树 JAVA 遍历 递归

1.二叉树(binary tree)是节点的有限集合,这个集合或者空,或者由一个根及两个互不相交的称为这个根的左子树或右子树构成。 从定义可以看出,二叉树包括:1.空树 2.只有一个根节点 3.只有左子树 4.只有右子树 5.左右子树都存在 有且仅有这5中表现形式。

(1)前序遍历:按照“根左右”,先遍历根节点,再遍历左子树 ,再遍历右子树

(2)中序遍历:按照“左根右“,先遍历左子树,再遍历根节点,最后遍历右子树

(3)后续遍历:按照“左右根”,先遍历左子树,再遍历右子树,最后遍历根节点 

         其中前,后,中指的是每次遍历时候的根节点被遍历的顺序 

性质1:在二叉树的第i层上至多有2^(i-1)个节点(i >= 1)

性质2:深度为k的二叉树至多有2^k-1个节点(k >=1)

性质3:对于任意一棵二叉树T而言,其叶子节点数目为N0,度为2的节点数目为N2,则有N0 = N2 + 1。

性质4:具有n个节点的完全二叉树的深度 。

满二叉树:一棵深度为k,且有2^k-1个节点称之为满二叉树。也就是除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。 
完全二叉树:深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树 
平衡二叉树:平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

下面看个例子

public class Tree {
    private Node root;
    private List<Node> list=new ArrayList<Node>();
    public Tree(){
        init();
    }

    public void init(){
        Node x=new Node("X",null,null);
        Node y=new Node("Y",null,null);
        Node d=new Node("d",x,y);
        Node e=new Node("e",null,null);
        Node f=new Node("f",null,null);
        Node c=new Node("c",e,f);
        Node b=new Node("b",d,null);
        Node a=new Node("a",b,c);
        root =a;
    }

    private class Node{
      private String data;
      private Node lchid;
      private Node rchild;
      public Node(String data, Node lchid, Node rchild) {
        
        this.data = data;
        this.lchid = lchid;
        this.rchild = rchild;
    }
      
    }
    
    /**
     * 对该二叉树进行前序遍历 结果存储到list中 前序遍历:abdXYcef
     */
    public void preOrder(Node node)
    {

           list.add(node); 
           if(node.lchid != null)
           {
               preOrder(node.lchid);
           }
           if(node.rchild != null)
           {
               preOrder(node.rchild);
           }
    }

    /**
     * 对该二叉树进行中序遍历 结果存储到list中  中序遍历:XdYbaecf
     */
    public void inOrder(Node node)
    {
       if(node.lchid!=null){
           inOrder(node.lchid);
       }
       list.add(node);
       if(node.rchild!=null){
           inOrder(node.rchild);
       }
    }

    /**
     * 对该二叉树进行后序遍历 结果存储到list中  后续遍历:XYdbefca
     */
    public void postOrder(Node node)
    {
        if(node.lchid!=null){
            postOrder(node.lchid);
        }
        if(node.rchild!=null){
            postOrder(node.rchild);
        }
        list.add(node);

    }

    /**
     * 返回当前数的深度
     */
    public int getTreeDepth(Node node) {

           if(node.lchid == null && node.rchild == null)
           {
               return 1;
           }
           int left=0,right = 0;
           if(node.lchid!=null)
           {
               left = getTreeDepth(node.lchid);
           }
           if(node.rchild!=null)
           {
               right = getTreeDepth(node.rchild);
           }
           return left>right?left+1:right+1;
       }
    public List<Node> getResult()
    {
     return list;
    }

    public static void main(String[] args) {
        
        Tree tree1=new Tree();
        //tree.preOrder(tree.root);
        tree1.preOrder(tree1.root);
        for(Node node:tree1.getResult()){
            System.out.println(node.data);
        }
        System.out.println("树的深度是"+tree1.getTreeDepth(tree1.root));
        
        Tree tree2=new Tree();
        //tree.preOrder(tree.root);
        tree2.inOrder(tree2.root);
        for(Node node:tree2.getResult()){
            System.out.println(node.data);
        }
        System.out.println("树的深度是"+tree2.getTreeDepth(tree2.root));
        
       Tree tree3=new Tree();
       //tree.preOrder(tree.root);
       tree3.postOrder(tree3.root);
       for(Node node:tree3.getResult()){
           System.out.println(node.data);
       }
       System.out.println("树的深度是"+tree3.getTreeDepth(tree3.root));

   } 

}

代码来源于网络(稍加修改)

猜你喜欢

转载自blog.csdn.net/guojinyu_001/article/details/81285645