• 536. Construct Binary Tree from String


    package LeetCode_536
    
    import java.util.*
    
    /**
     * 536. Construct Binary Tree from String
     * (Prime)
     * You need to construct a binary tree from a string consisting of parenthesis and integers.
    The whole input represents a binary tree.
    It contains an integer followed by zero, one or two pairs of parenthesis.
    The integer represents the root's value and a pair of parenthesis contains a child binary tree with the same structure.
    You always start to construct the left child node of the parent first if it exists.
    Example:
    Input: "4(2(3)(1))(6(5))"
    Output: return the tree root node representing the following tree:
         4
       /  
      2    6
     /   /
    3  1 5
    Note:
    There will only be '(', ')', '-' and '0' ~ '9' in the input string.
    An empty tree is represented by "" instead of "()".
     * */
    class TreeNode(var value: Int){
        var left: TreeNode? = null
        var right: TreeNode? = null
    }
    class Solution {
        /*
        * solution: Stack with pre-order (root->left->right) traversal,the top of stack should be current root
        * Time complexity:O(n), Space complexity:O(n)
        * */
        fun str2Tree(s: String): TreeNode?{
            if (s==null || s.isEmpty()){
                return null
            }
            val stack = Stack<TreeNode>()
            for (i in s.indices){
                val c = s[i]
                if (c in '0'..'9' || c=='-'){
                    var start = i
                    //keep to find out the whole digit number
                    while (i+1<s.length && (s[i+1] in '0'..'9')){
                        start++
                    }
                    //create current node by get the number above
                    val curValue = s.substring(start,i+1).toInt()
                    val curNode = TreeNode(curValue)
                    if (stack.isNotEmpty()){
                        //curNode is the child node of top node
                        val top = stack.peek()
                        if (top.left == null){
                            top.left = curNode
                        } else {
                            top.right = curNode
                        }
                    }
                    stack.push(curNode)
                } else if (c==')') {
                    //mean current side had handle finish
                    stack.pop()
                }
            }
            //print the result
            traversal(stack.peek())
            return stack.peek()
        }
    
        //print by pre-order
        private fun traversal(root: TreeNode?) {
            if (root == null) return
            print(root.value)
            print(",")
            traversal(root.left)
            traversal(root.right)
        }
    }
  • 相关阅读:
    linux使用rm-rf删除之文件恢复
    性能测试常见瓶颈分析及调优方法
    性能压测QPS 和 TPS区别
    Linux查看系统性能
    Python中split()和split(" ")的区别
    Python-标准库之functools
    Python-内置函数_@propery、@classmethod、@staticmethod详解
    Python-类的内置方法中__repr__和__str__的区别
    Python-标准库之运算符替代函数Operator
    Python-标准库之迭代器-itertools
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13818167.html
Copyright © 2020-2023  润新知