博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树的遍历问题总结
阅读量:7041 次
发布时间:2019-06-28

本文共 3166 字,大约阅读时间需要 10 分钟。

这篇文章展示了用ruby使用不同的方法对二叉树进行遍,并且实现了不同遍历方式的iterator,希望对大家有所帮助。

Talk is cheap, show me the code! 

1. Pre-order Traversal (前序遍历先访问当前的节点,然后再访问它的孩子节点)

Non-recursive

def pre_order_traversal(root)  return [] if root.nil?    res = []  stack = []    node = root    while node || !stack.empty?    while node      res << node.val      stack << node      node = node.left    end        if (!stack.empty?)      node = stack.pop      node = node.right    end  end  resend

Recursive

def pre_order_traversal(root)  return [] if root.nil?    res = []    res << root.val  res += pre_order_traversal(root.left)  res += pre_order_traversal(root.right)end

Iterator

class BTIterator  @@stack = []    def initialize(root)    @@stack << root  end    def has_next?    !@@stack.empty?  end    def next    if !has_next?      return -(1 << 32)    end        node = @@stack.pop        if node.right      @@stack << node.right    end        if node.left      @@stack << node.left    end        node.val  endend

2. In-order Traversal (中序遍历先访问当前节点左边分支,然后访问当前节点,最后访问右边的分支)

Non-recursive

def in_order_traversal(root)  return [] if root.nil?    res = []  stack = []    node = root    while node || !stack.empty?    while node      stack << node      node = node.left    end            if (!stack.empty?)      node = stack.pop      res << node.val      node = node.right    end  end  resend

Recursive

def in_order_traversal(root)  return [] if root.nil?    res = []    res += pre_order_traversal(root.left)  res << root.val  res += pre_order_traversal(root.right)end

Iterator

class BTIterator  @@stack = []    def initialize(root)    add_node_to_stack(root)  end    def has_next?    !@@stack.empty?  end    def next    if !has_next?      return -(1 << 32)    end        node = @@stack.pop    add_node_to_stack(node.right)         node.val  end    def add_node_to_stack(node)    while node      @@stack << node      node = node.left    end  endend 

3. Post-order Traversal (后序遍历先访问当前节点的所有孩子节点,然后再访问当前节点)

Non-recursive

def post_order_traversal(root)  return [] if root.nil?    res = []  stack = []  cur = root  prev = nil    while cur    stack << cur    cur = cur.left  end    while !stack.empty?    cur = stack.pop        if cur.right && cur.right != prev      stack << cur      cur = cur.right            while cur        stack << cur        cur = cur.left      end    else      res << cur.val      prev = cur    end  end  resend

recursive

def post_order_traversal(root)  return [] if root.nil?    res = []    res += post_order_traversal(root.left)  res += post_order_traversal(root.right)  res << root.valend

Iterator

class BTIterator  @@stack = []    def initialize(root)    find_next_leaf(root)  end    def has_next?    !@@stack.empty?  end    def next    if !has_next?      return -(1 << 32)    end        node = @@stack.pop        if !@@stack.empty?      top = @@stack.last            if node == top.left        find_next_leaf(top.right)      end    end        node.val  end    def find_next_leaf(node)    while node      @@stack << node            if node.left        node = node.left      else        node = node.right      end    end  endend

 

转载于:https://www.cnblogs.com/infinitycoder/p/9222530.html

你可能感兴趣的文章
开发之路(设计模式六:命令模式上)
查看>>
JavaScript:并发模型与Event Loop
查看>>
CSS揭秘之《条纹背景》
查看>>
用Kettle从excel中将导入oracle数据库的简单方法
查看>>
【跨域】跨域的简易实现和测试
查看>>
获得字符串包含↵,渲染到页面不换行的解决办法
查看>>
北哥这篇文讲解yii2权限扩展(yii2-admin) - 下部
查看>>
微信web开发遇到的坑
查看>>
写了一个数字转成简 / 繁体汉字的助手函数
查看>>
vue配合iview/element等ui实现界面效果起步
查看>>
仿饿了么项目-vue的学习笔记总目录
查看>>
Angular 2.x+ 如何动态装载组件
查看>>
React中的setTimeout、setInterval的注意事项
查看>>
如何深入使用scss开发一个简单页面
查看>>
JS学习系列 03 - 函数作用域和块作用域
查看>>
外卖订单爬虫(美团,饿了么,百度外卖)
查看>>
用Flink取代Spark Streaming,知乎实时数仓架构演进
查看>>
2019年值得关注的八大DevOps趋势
查看>>
教育部下令中小学推广编程教育,全民AI真的要来了
查看>>
C#未来新特性:静态委托和函数指针
查看>>