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

(一)二叉搜索树的遍历

  • 二叉树如图

在这里插入图片描述

先序遍历

  • 访问顺序:

    • 根节点、前序遍历左子树,前序遍历右子树
    • 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;
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿红

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值