二叉树的链式结构遍历

所谓遍历(Traversal)就是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问,访问结点所做的操作依赖于具体的问题应用,如下图是一颗二叉树,红色路线位遍历路线

         

 二叉树的遍历按照访问结点的顺序分为:

前序遍历(PreOrder Traversal):先访问根结点,再访问左右子树

中序遍历(InOrder Traversal):先访问左子树,然后是根结点,其次是右子树

后序遍历(PostOrder Traversal):先访问左子树,然后是右子树,最后是根结点

除了前中后序外还可以对二叉树进行层序遍历,层序遍历就是设根结点所在的一层为第一层,首先访问第一层,然后依次从左到右访问第二层上的结点,接着是第三层上的结点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历.遍历路线如图所示

                                           

 前序遍历:

    /**
     * 前序遍历
     * @param root
     */

    private static void preOrderTraversal(Node root){
       if(root != null){
           //根 左子树的前序遍历 右子树的前序遍历
           System.out.print(root.value + " ");

           preOrderTraversal(root.left);
           preOrderTraversal(root.right);
       }
    }

中序遍历:


    /**
     * 中序遍历
     * @param root
     */

    private static void inOrderTraversal(Node root){
        if(root != null){
            //左子树的中序遍历 根 右子树的中序遍历
            inOrderTraversal(root.left);
            System.out.print(root.value+" ");
            inOrderTraversal(root.right);
        }
    }

后序遍历:

    /**
     * 后序遍历
     * @return
     */

    private static void postOrderTraversal(Node root){
        if(root != null){
            //左子树的后序遍历 右子树的后序遍历 根
            postOrderTraversal(root.left);
            postOrderTraversal(root.right);
            System.out.print(root.value +" ");
        }
    }

求二叉树的结点个数:

    /**
     * 求二叉树节点个数
     */
    private static int count=0;
    //用前序遍历求二叉树的节点个数
    private static void countByTraversal(Node root){
        if(root != null){
            count++;
            countByTraversal(root.left);
            countByTraversal(root.right);
        }
    }

求二叉树中国叶子结点个数:

    /**
     * 求二叉树叶子节点个数
     * @param root
     * @return
     */
    private static int leafCount(Node root){
        //叶子节点个数
        if(root == null){
            return 0;
        }else if(root.left == null && root.right == null){
            return 1;
        }else{
            return leafCount(root.left)+leafCount(root.right);
        }
    }

求二叉树的高度:


    /**
     * 求二叉树的高度
     * @param root
     * @return
     */
    private static int height(Node root){
        //空树
        //其他  max(left,right)+1;
        if(root == null){
            return 0;
        }else{
            int left = height(root.left);
            int right = height(root.right);
            return (left>right ? left:right)+1;
        }
    }

求二叉树第k层的结点个数:

    /**
     * 求k层节点个数
     * @param root
     * @param k
     * @return
     */
    private static int kLevel(Node root,int k){
        if(root == null){
            return 0;
        }else if(k == 1){
            return 1;
        }else{
            return kLevel(root.left,k-1)+kLevel(root.right,k-1);
        }
    }

在二叉树中查找元素:

    /**
     * 在二叉树中查找元素
     * @param root
     * @param v
     * @return
     */
    private static Node find(Node root,char v){
        if(root == null){
            return null;
        }
        if(root.value == v){
            return root;
        }
        Node r = find(root.left,v);
        if(r != null){
            return r;
        }
        r=find(root.right,v);
        if(r != null){
            return r;
        }
        return null;
    }

猜你喜欢

转载自blog.csdn.net/weixin_43224539/article/details/89430472