zoukankan      html  css  js  c++  java
  • LeetCode 每日一题 11028. 从先序遍历还原二叉树

    题目描述

    我们从二叉树的根节点 root 开始进行深度优先搜索。

    在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。

    如果节点只有一个子节点,那么保证该子节点为左子节点。

    给出遍历输出 S,还原树并返回其根节点 root。

    输入:"1-2--3--4-5--6--7"
    输出:[1,2,5,3,4,6,7]
    
    输入:"1-2--3---4-5--6---7"
    输出:[1,2,5,3,null,6,null,4,null,7]
    
    输入:"1-401--349---90--88"
    输出:[1,401,null,349,88,90]
    

    提示:

    • 原始树中的节点数介于 1 和 1000 之间。
    • 每个节点的值介于 1 和 10 ^ 9 之间。

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

    My Solution

    DFS 用栈来保存路径,这里用的 stack<pair<TreeNode*, int>>stk; 同时记录节点的深度。
    DFS 时显然有深度是递增的。利用这一点找到当前节点的父节点即可。

    #pragma G++ optimize("O2")
    
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
     public:
      pair<int, int> parseString(string &s, int& idx) {
        int depth = 0;
        while(s[idx] == '-')
          depth++, idx++;
        int val = atoi(s.c_str() + idx);
        while(isdigit(s[idx]))
          idx++;
        //cout << ": " << val << " " << depth << endl;
        return make_pair(val, depth);
      }
    
      TreeNode* recoverFromPreorder(string S) {
        stack<pair<TreeNode*, int>>stk;
        pair<TreeNode*, int>u;
        TreeNode*root = nullptr;
        int idx = 0;
        while(idx < S.length()) {
          const pair<int, int> u = parseString(S, idx);
          if(stk.size() == 0) {
            root = new TreeNode(u.first);
            stk.push(make_pair(root, u.second));
          } else {
            while(stk.top().second >= u.second)
              stk.pop();
    
            TreeNode *node = new TreeNode(u.first);
            if(stk.top().first->left == nullptr) {
              stk.top().first->left = node;
              stk.push(make_pair(node, u.second));
            } else if(stk.top().first->right == nullptr) {
              stk.top().first->right = node;
              stk.push(make_pair(node, u.second));
            } else {
              cout << " ?? " << endl;
            }
          }
        }
        return root;
      }
    };
    
    
  • 相关阅读:
    typedef和define的详细区别
    谈谈Android Activity的生命周期管理
    【Android面试】Android面试题集锦 (陆续更新)(最新2012618)
    [ZZ]Ubuntu<>Windows 远程桌面连接(debian等同)
    C语言中的全局变量内存分配和初始化顺序
    [刘未鹏]怎样花两年时间去面试一个人
    线程间通信常用的三种方法
    C语言const详解
    细雨寒风水冰 no
    C#读取*.sql文件,并执行里面的SQL语句 no
  • 原文地址:https://www.cnblogs.com/Forgenvueory/p/13156026.html
Copyright © 2011-2022 走看看