前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1028. 从先序遍历还原二叉树(栈)

LeetCode 1028. 从先序遍历还原二叉树(栈)

作者头像
Michael阿明
发布2020-07-13 16:00:41
2960
发布2020-07-13 16:00:41
举报

1. 题目

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

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

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

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

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
示例 1:
输入:"1-2--3--4-5--6--7"
输出:[1,2,5,3,4,6,7]
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
示例 2:
输入:"1-2--3---4-5--6---7"
输出:[1,2,5,3,null,6,null,4,null,7]
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
示例 3:
输入:"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 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 栈解题

  • 用一个栈存储pair<TreeNode*, depth>
  • 将节点和其深度,不断地压栈
  • 但是,当前节点的深度depth <= 栈顶的,说明需要往上面找父节点,所以弹栈
  • 找到深度比我小的即是父节点,优先接在左节点
代码语言:javascript
复制
class Solution {
public:
    TreeNode* recoverFromPreorder(string S) {
        int depth = 0, i = 0, val = 0;
        stack<pair<TreeNode*,int>> stk;
        TreeNode *root, *cur;
        val = getVal(S,i);
        root = new TreeNode(val);
        stk.push(make_pair(root,0));
        while(i < S.size())
        {
        	depth = getDep(S,i);
        	val = getVal(S,i);
        	cur = new TreeNode(val);
        	while(stk.top().second >= depth)
        		stk.pop();
        	if(stk.top().first->left)
        		stk.top().first->right = cur;
        	else
        		stk.top().first->left = cur;
        	stk.push(make_pair(cur,depth));
        }
        return root;
    }

    int getVal(string &S, int &i)//获取数字
    {
    	int val = 0;
    	while(i < S.size() && isdigit(S[i]))
    		val = val*10+S[i++]-'0';
    	return val;
    }
    int getDep(string &S, int &i)//获取深度
    {
    	int depth = 0;
    	while(S[i] == '-')
    	{
    		depth++;
    		i++;
    	}
    	return depth;
    }
};
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 栈解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档