前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >再写二叉树遍历 olr lor lro leveltraverse depthtraverse

再写二叉树遍历 olr lor lro leveltraverse depthtraverse

作者头像
大话swift
修改2019-07-04 17:53:27
3200
修改2019-07-04 17:53:27
举报
文章被收录于专栏:大话swift

对于二叉树遍历是经久不衰

之前我们只是写了前中后序遍历没有对深度和广度进行过遍历,这次就进行一下不全

定义我们的二叉树

代码语言:javascript
复制
class Bitree<T>{
 var value:T
 var left:Bitree?
 var right:Bitree?
 init(_ value:T) {
 self.value = value
 }
}
由于我们需要用到堆栈的操作,我们就对Array做扩展来完成
// MARK: - 使用数组构造出 栈的特性 push pop
extension Array{
 mutating func pop() -> Element {
 return removeFirst()
 }
 mutating func push(node:Element) -> Void {
 insert(node, at: 0)
 }
}
基本的数据访问
/// 访问节点
///
/// - Parameter t:
func visit<T>(_ t:Bitree<T>){
 print("\(t.value)")
}
/// 广度优先遍历
///
/// - Parameter tree: 根节点
func levelTraverse<T>(tree:Bitree<T>?){
 if tree == nil{
 return
 }
 var queue:Array<Bitree<T>> = [Bitree<T>]()
 if queue.isEmpty {
 queue.append(tree!)
 }
 /**
 利用队列FIFO实现广度优先
 */
 while queue.isEmpty == false {
 let q = queue.first
 queue.removeFirst()
 visit(q!)
 if q?.left != nil {
 queue.append((q?.left)!)
 }
 if q?.right != nil {
 queue.append((q?.right)!)
 }
 }
}
/// 深度优先遍历 实质 就是 olr(先序遍历)
/// 利用FILO 符合stac的特点
/// - Parameter tree: 根节点
func depthTracerse<T>(tree:Bitree<T>?){
 if tree == nil {
 return
 }
 var stack:[Bitree<T>] = [Bitree<T>]()
 stack.push(node: tree!)
 while !stack.isEmpty {
 let p = stack.pop()
 print("\(p.value)")
 if p.right != nil {
 stack.push(node: p.right!)
 }
 if p.left != nil {
 stack.push(node: p.left!)
 }
 }
}

其中对于深度优先 大家很快就明了 其实就是olr先序遍历

好了赋上咱们的olr lor lro

代码语言:javascript
复制
//中序
func lor<T>(tree:Bitree<T>?){
 if tree != nil {
 lor(tree: tree?.left)
 visit(tree!)
 lor(tree: tree?.right)
 }
}
//先序
func olr<T>(tree:Bitree<T>?){
 if tree != nil {
 visit(tree!)
 olr(tree: tree?.left)
 olr(tree: tree?.right)
 }
}
func lro<T>(tree:Bitree<T>?){
 if tree != nil{
 lro(tree: tree?.left)
 lro(tree: tree?.right)
 visit(tree!)
 }
}

最后是咱们的测试数据

let b1 = Bitree(1)

let b2 = Bitree(2)

let b3 = Bitree(3)

let b4 = Bitree(4)

let b5 = Bitree(5)

let b6 = Bitree(6)

b1.left = b2

b1.right = b3

b2.left = b4

b2.right = b5

b3.left = b6

print("中序遍历")

lor(tree: b1)

print("先序遍历")

olr(tree: b1)

print("后序遍历")

lro(tree: b1)

print("层次遍历")

levelTraverse(tree: b1)

print("深度遍历")

depthTracerse(tree: b1)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档