zoukankan      html  css  js  c++  java
  • leetcode刷题笔记九十四题 二叉树的中序遍历

    leetcode刷题笔记九十四题 二叉树的中序遍历

    源地址:94. 二叉树的中序遍历

    问题描述:

    给定一个二叉树,返回它的中序 遍历。

    示例:

    输入: [1,null,2,3]
    1

    2
    /
    3

    输出: [1,3,2]

    /**
    本题共有三种解法,第一种为常规的递归解法
    */
    /**
     * Definition for a binary tree node.
     * class TreeNode(var _value: Int) {
     *   var value: Int = _value
     *   var left: TreeNode = null
     *   var right: TreeNode = null
     * }
     */
    import scala.collection.mutable
    object Solution {
        def inorderTraversal(root: TreeNode): List[Int] = {
            def helper(root: TreeNode, res: mutable.ListBuffer[Int]): Unit = {
                if (root != null){
                    if(root.left != null)   helper(root.left, res)
                    res += root.value
                    if(root.right != null) helper(root.right, res)
                }
            }
            var res = new mutable.ListBuffer[Int]()
            helper(root, res)
            return res.toList
        }
    }
    
    /**
    非递归模式,使用Stack辅助的解法,沿左子树入栈,直至左子树为空,开始退栈,并访问退栈元素的右子树
    */
    /**
     * Definition for a binary tree node.
     * class TreeNode(var _value: Int) {
     *   var value: Int = _value
     *   var left: TreeNode = null
     *   var right: TreeNode = null
     * }
     */
    import scala.collection.mutable
    object Solution {
        def inorderTraversal(root: TreeNode): List[Int] = {
            var res = mutable.ListBuffer[Int]()
            var stack = mutable.Stack[TreeNode]()
            var start = root
    
            while (stack.size > 0 || start != null){
                if (start != null){
                    stack.push(start)
                    start = start.left
                }
                else{
                    val temp = stack.pop()
                    res += temp.value
                    start = temp.right
                }
            }
            return res.toList      
        }
    }
    
    /**
    不借用额外空间结构辅助莫里斯遍历,依次将以root为根的右子树移至root左子树的最右节点的右儿子
    */
    /**
     * Definition for a binary tree node.
     * class TreeNode(var _value: Int) {
     *   var value: Int = _value
     *   var left: TreeNode = null
     *   var right: TreeNode = null
     * }
     */
    import scala.collection.mutable
    object Solution {
        def inorderTraversal(root: TreeNode): List[Int] = {
            var res = mutable.ListBuffer[Int]()
            var stack = mutable.Stack[TreeNode]()
            var start = root
            var prev = root
    
            while (start != null){
                //左子树不为空
                if(start.left != null){
                    prev = start.left
                    while(prev.right != null){
                        prev = prev.right
                    }
                    prev.right = start
                    var temp = start
                    start = start.left
                    temp.left = null
                }
                //左子树为空
                else{
                    res += start.value
                    start = start.right
                }
            }
            return res.toList      
        }
    }
    
  • 相关阅读:
    C# Serializable(转)
    ASP.NET 2.0中构造个性化网页 (转)
    ASP如何限定中英文混合的文字输出字数?
    关于clientHeight、offsetHeight、scrollHeight
    无法删除,打开的文件夹
    学习.Net的经典网站(转)
    SQL注入漏洞全接触进阶篇
    关于robots.txt
    SQL注入漏洞全接触入门篇
    关于zend解密的程序
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13405767.html
Copyright © 2011-2022 走看看