二叉树的链式结构遍历

本文详细介绍了二叉树的三种遍历方式:前序遍历(根-左-右),中序遍历(左-根-右),后序遍历(左-右-根)。同时讨论了如何计算二叉树的节点个数和叶子节点个数,提供了一种理解二叉树遍历和结构的方法。
摘要由CSDN通过智能技术生成

所谓遍历(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;
    }

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值