• [LeetCode] 536. Construct Binary Tree from String


    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 1:

    Input: s = "4(2(3)(1))(6(5))"
    Output: [4,2,6,3,1,5]
    

    Example 2:

    Input: s = "4(2(3)(1))(6(5)(7))"
    Output: [4,2,6,3,1,5,7]
    

    Example 3:

    Input: s = "-4(2(3)(1))(6(5)(7))"
    Output: [-4,2,6,3,1,5,7]

    Constraints:

    • 0 <= s.length <= 3 * 104
    • s consists of digits, '('')', and '-' only.

    从字符串生成二叉树。

    你需要从一个包括括号和整数的字符串构建一棵二叉树。

    输入的字符串代表一棵二叉树。它包括整数和随后的 0 ,1 或 2 对括号。整数代表根的值,一对括号内表示同样结构的子树。

    若存在左子结点,则从左子结点开始构建。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/construct-binary-tree-from-string
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路是用栈。仔细观察你会发现input字符串里面节点值val实际是按前序遍历给的。首先排除corner case比如input字符串为空的情况,就直接返回NULL。对于一般情况而言,我们首先一点点构造节点值,这里同时注意,节点值有可能是负的。构造出来节点的值之后,此时如果栈不为空,则说明此时构造的节点是栈顶元素的左孩子或者右孩子。这里要优先构造左孩子。指针连好之后,把节点入栈。

    遇到左括号不做任何动作,但是遇到右括号则把栈顶元素弹出。最后理想情况下,栈里面只会剩下根节点;若栈为空,则return null。

    时间O(n)

    空间O(n)

    Java实现

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode() {}
     8  *     TreeNode(int val) { this.val = val; }
     9  *     TreeNode(int val, TreeNode left, TreeNode right) {
    10  *         this.val = val;
    11  *         this.left = left;
    12  *         this.right = right;
    13  *     }
    14  * }
    15  */
    16 class Solution {
    17     public TreeNode str2tree(String s) {
    18         Stack<TreeNode> stack = new Stack<>();
    19         for (int i = 0; i < s.length(); i++) {
    20             // 左括号,不作任何动作
    21             if (s.charAt(i) == '(') {
    22                 continue;
    23             }
    24             // 右括号,弹出栈顶元素
    25             // 因为input里括号的结束代表当前子树已经遍历完了
    26             else if (s.charAt(i) == ')') {
    27                 stack.pop();
    28             }
    29             // 构建数字
    30             else if (s.charAt(i) >= '0' && s.charAt(i) <= '9' || s.charAt(i) == '-') {
    31                 int start = i;
    32                 while (i + 1 < s.length() && s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '9') {
    33                     i++;
    34                 }
    35                 TreeNode root = new TreeNode(Integer.valueOf(s.substring(start, i + 1)));
    36                 // 如果栈不为空,那么栈顶元素就是当前节点的父亲
    37                 if (!stack.isEmpty()) {
    38                     TreeNode parent = stack.peek();
    39                     if (parent.left == null) {
    40                         parent.left = root;
    41                     } else {
    42                         parent.right = root;
    43                     }
    44                 }
    45                 stack.push(root);
    46             }
    47         }
    48         if (stack.isEmpty()) {
    49             return null;
    50         }
    51         return stack.peek();
    52     }
    53 }

    相关题目

    297. Serialize and Deserialize Binary Tree

    449. Serialize and Deserialize BST

    536. Construct Binary Tree from String

    606. Construct String from Binary Tree

    LeetCode 题目总结

  • 相关阅读:
    UVA247 电话圈 Calling Circles
    Python开发之路
    Day 8-模块
    Homework
    Day 7- 装饰器
    Day 6-文件操作的其他方法 迭代器 生成器
    数据-进制
    Day 5-变量与高阶函数
    Day 4-集合、百分号拼接及函数
    Day 3-Python列表、元祖、词典
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13850079.html
Copyright © 2020-2023  润新知