07.二叉树的遍历和求其高度

84 阅读2分钟

(一)二叉搜索树的遍历

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

  • 📝 个人主页:程序员阿红🔥
  • 🎉 支持我:点赞👍收藏⭐️留言📝
  • 🍓欢迎大家关注哦,互相学习🍓
  • 🍋欢迎大家访问哦,互相学习🍋
  • 🍑欢迎大家收藏哦,互相学习🍑
  • 二叉树如图 在这里插入图片描述

先序遍历

  • 访问顺序:

    • 根节点、前序遍历左子树,前序遍历右子树
    • 7、4、2、1、3、5、9、8、11、10、12
  • 递归遍历代码:

    public void preorderTraversal() {
    		preorderTraversal(root);
    	}
        public void preorderTraversal(Node<E> node){
            if (node == null ) return;
            System.out.println(node.element);
            preorderTraversal(node.left);
            preorderTraversal(node.right);
        }
    

中序遍历

  • 访问顺序
    • 先中序遍历左子树、根节点、在中序遍历右子树
    • 1、2、3、4、5、7、8、9、10、11、12
public void middleOrderTraversal(){
    middleOrderTraversal(root);
}
    public void middleOrderTraversal(Node<E> node){
        if (node == null ) return;
        middleOrderTraversal(node.left);
        System.out.println(node.element);
        middleOrderTraversal(node.right);
    }

后序遍历

  • 访问顺序:
    • 先后序遍历左子树、在后序遍历右子树、根节点。
    • 1、3、2、5、4、8、10、12、11、9、7

    public void postOrderTraversal(){
        postOrderTraversal(root);
    }
    public void postOrderTraversal(Node<E> node){
        if (node == null ) return;
        postOrderTraversal(node.left);
        postOrderTraversal(node.right);
        System.out.println(node.element);
    }

层序遍历

  • 访问顺序:
    • 从上到下,从左到右依次访问每一个结点
    • 7、4、9、2、5、8、11、1、3、10、12

在这里插入图片描述

  • 实现思路:使用队列

    1、将根节点入队

    2、循环执行一下操作、直到队列为空。

    • 将队头节点A出队,进行访问

    • 将A的左子节点入队

    • 将A的右子节点入队

 //层次遍历
    public void levelOrderTraversal(){
        if (root == null) return;
        Queue<Node<E>> queue = new LinkedList<>();
        queue.offer(root);//根节点入队
        while(!queue.isEmpty()){
            Node<E> node =  queue.poll();
            System.out.println(node.element);//输出节点元素
            if ( node.left != null ){
                queue.offer(node.left);
            }
            if ( node.right != null ){
                queue.offer(node.right);
            }
        }
    }

(二)求二叉树的高度

方法一:递归遍历

比较左右子树的高度,谁的高度高,则树的高度则为:1+子数高度较高的;

public int height(){
        return height(root);
    }
    public int height(Node<E> node){
        if (node == null) return 0;
       return 1 + Math.max(height(node.left),height(node.right));
    }

方法二:非递归

  • 采用层次遍历
 public int getTreeHeight(){
        if (root == null ) return 0;
        Queue<Node<E>> queue = new LinkedList();
        queue.offer(root);
        int levelNum = 1;   //存取层的节点树
        int height = 0;
        while(!queue.isEmpty()){
            Node<E> node =  queue.poll();//出队
            levelNum--;//有多少个节点就遍历多少次
            if (node.left != null){
                queue.offer(node.left);
            }
            if (node.right != null){
                queue.offer(node.right);
            }
            //levelNum默认为1(只要根节点不为空,高度自然从1开始)
            //每回遍历完一层,queue的大小为下一层节点的数目
            if (levelNum == 0){
                levelNum = queue.size();
                height++;
            }
        }
        return height;
    }

验证: 在这里插入图片描述

💖💖💖 完结撒花

💖💖💖 路漫漫其修远兮,吾将上下而求索

💖💖💖 写作不易,如果您觉得写的不错,欢迎给博主点赞、收藏、评论来一波~让博主更有动力吧