返回介绍

solution / 1000-1099 / 1028.Recover a Tree From Preorder Traversal / README

发布于 2024-06-17 01:03:32 字数 2921 浏览 0 评论 0 收藏 0

1028. 从先序遍历还原二叉树

English Version

题目描述

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

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

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

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

 

示例 1:

输入:"1-2--3--4-5--6--7"
输出:[1,2,5,3,4,6,7]

示例 2:

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

示例 3:

输入:"1-401--349---90--88"
输出:[1,401,null,349,88,90]

 

提示:

  • 原始树中的节点数介于 11000 之间。
  • 每个节点的值介于 110 ^ 9 之间。

解法

方法一

/**
 * 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:
  TreeNode* recoverFromPreorder(string S) {
    stack<TreeNode*> st;
    int depth = 0;
    int num = 0;
    for (int i = 0; i < S.length(); ++i) {
      if (S[i] == '-') {
        depth++;
      } else {
        num = 10 * num + S[i] - '0';
      }
      if (i + 1 >= S.length() || (isdigit(S[i]) && S[i + 1] == '-')) {
        TreeNode* newNode = new TreeNode(num);
        while (st.size() > depth) {
          st.pop();
        }
        if (!st.empty()) {
          if (st.top()->left == nullptr) {
            st.top()->left = newNode;
          } else {
            st.top()->right = newNode;
          }
        }
        st.push(newNode);
        depth = 0;
        num = 0;
      }
    }
    TreeNode* res;
    while (!st.empty()) {
      res = st.top();
      st.pop();
    }
    return res;
  }
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文