二叉树-遍历

为什么需要数这种数据结构?

1.数组存储方式的分析

  • 优点:通过下标方式访问元素,速度快。对于有序数组,还可以使用二分查找提高检索速度。

  • 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低。

2.链式存储方式的分析

  • 优点:在一定程度上对数组方式优化(比如:插入一个数值结点,只需要将插入结点链接到链表中即可)。
  • 缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头结点开始遍历)

3.树存储方式分析

  • 能提高数据存储、读取的效率,比如利用二叉排序树(BST),既可以保证数据的检索速度,同时也可以保证数据的插入、删除、修改的速度。

树的常用术语包括:
节点,根节点,父节点,子节点,叶子节点,节点的权,路径,层,子树,树的高度,森林。
数的类型:
满二叉树,完全二叉树。

二叉树的遍历

先序遍历、中序遍历、后序遍历。
在这里插入图片描述

代码实现

package chapter18.binarytree

object BinaryTreeDemo {
  def main(args: Array[String]): Unit = {
    //先使用比较简单的方法,直接关联
    val root = new HeroNode(1, "宋江")
    val hero2 = new HeroNode(2, "吴用")
    val hero3 = new HeroNode(3, "卢俊义")
    val hero4 = new HeroNode(4, "林冲")
    val hero5 = new HeroNode(5, "关胜")
    root.left = hero2
    root.right = hero3
    hero3.left = hero5
    hero3.right = hero4

    val binaryTree = new BinaryTree
    binaryTree.root = root

    println("前序遍历")
    binaryTree.preOrder()

    println("中序遍历")
    binaryTree.infixOrder()

    println("后序遍历")
    binaryTree.postOrder()
  }
}

//定义节点
class HeroNode(hNo: Int, hName: String) {
  val no = hNo
  var name = hName
  var left: HeroNode = null
  var right: HeroNode = null

  //前序遍历
  def preOrder(): Unit = {
    //先输出当前节点的值
    println(s"节点信息 no=${no} name = ${name}")
    //向左递归,输出左子树
    if (this.left != null) {
      this.left.preOrder()
    }
    //向右递归,输出右子树
    if (this.right != null) {
      this.right.preOrder()
    }
  }

  //中序遍历
  def infixOrder(): Unit = {
    //向左递归,输出左子树
    if (this.left != null) {
      this.left.infixOrder()
    }
    //先输出当前节点的值
    println(s"节点信息 no=${no} name = ${name}")
    //向右递归,输出右子树
    if (this.right != null) {
      this.right.infixOrder()
    }
  }

  //后续遍历
  def postOrder(): Unit = {
    //向左递归,输出左子树
    if (this.left != null) {
      this.left.postOrder()
    }
    //向右递归,输出右子树
    if (this.right != null) {
      this.right.postOrder()
    }
    //先输出当前节点的值
    println(s"节点信息 no=${no} name = ${name}")
  }
}

//二叉树
class BinaryTree {
  var root: HeroNode = null

  //前序遍历
  def preOrder() = {
    if (root != null) {
      root.preOrder()
    } else {
      println("当前二叉树为空,不能遍历")
    }
  }

  //中序遍历
  def infixOrder(): Unit = {
    if (root != null) {
      root.infixOrder()
    } else {
      println("当前二叉树为空,不能遍历")
    }
  }

  //后序遍历
  def postOrder(): Unit = {
    if (root != null) {
      root.postOrder()
    } else {
      println("当前二叉树为空,不能遍历")
    }
  }
}

运行结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值