【leetcode 968. 1028. 从先序遍历还原二叉树】解题报告[待完善...]

思路:用一个栈来管理树的层次关系,索引代表节点的深度

方法一:

    TreeNode* recoverFromPreorder(string S) {
        /*
            由题意知,最上层节点深度为0(数字前面0条横线),而第二层节点前有1条横线,表示深度为1
            树的前序遍历: 根-左-右
            因此,
        */
        if (S.empty()) return nullptr;
        vector<TreeNode*> stack;  // 结果栈
        for(int i=0,depth=0,val=0;i<S.size();)
        {
            for(depth=0;i<S.size()&&S[i]==‘-‘;++i)  // 计算节点的深度
                depth++;
            for(val=0;i<S.size()&&S[i]!=‘-‘;++i)    // 计算数值
                val=val*10+S[i]-‘0‘;
            while (stack.size()>depth)    // 若当前栈的长度(树的高度)大于节点的深度,则可以把栈中最后几个节点pop掉(这些节点各已经成为完整的子树,可以pop掉了)
                stack.pop_back();
            TreeNode* node=new TreeNode(val);   // 新建节点用于存放当前深度的结点
            if (!stack.empty()) // 节点间关联
            {
                if (!stack.back()->left)      stack.back()->left=node;
                else if(!stack.back()->right) stack.back()->right=node;
            }
            stack.push_back(node);
        }
        return stack[0];
    }

原文地址:https://www.cnblogs.com/brianyi/p/10804891.html

时间: 2024-10-23 12:58:35

【leetcode 968. 1028. 从先序遍历还原二叉树】解题报告[待完善...]的相关文章

根据先序、中序、后序遍历还原二叉树

遍历方式的转至二叉树的四种遍历方式 首先我们要知道三种遍历方式的规律: 先序遍历:跟在前,子树的根在后,左子树比右子树考前,且第一个就是根节点. 中序遍历:左子树在根左边,右子树在根右边,左边的部分是根节点的左子树的中序遍 历序列,右边部分是根节点右子树的中序遍历序列. 后序遍历:根在后,子树在根前且左子树比右子树靠前,且最后一个节点是根节点. 一.先序+中序 根据先序序列的第一个元素建立根节点 在中序序列中找到该元素,确定根节点的左右子树的中序序列 在先序序列中确定左右子树的先序序列 由左子树

UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)

Tree UVA - 548 题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的.还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的. 最后输出来叶子节点. 一开始写的时候是用gets读入的,报CE, 要用fgets写,关于fgets(),传送门: fgets函数及其用法,C语言fgets函数详解 一开始用bfs过的,后来发现,好多人都是dfs过的,又写了一下dfs... 代码: 1 //二叉树的中序和后序遍历还原树并输出最短路径的叶子

【Tree】已知前序和中序遍历还原二叉树

1 /************************** 2 https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 3 @date 2015.5.16 4 @description 5 根据前序和中序遍历,重构二叉树 6 可用迭代,也可以使用递归. 7 递归前面已经写过,耗时,这里再次做使用迭代. 8 9 @tags tree, array, depth-first se

如何根据前序、中序、后序遍历还原二叉树(转)

原文:https://blog.csdn.net/yanerhao/article/details/45175943 面试题目或多或少会出现这样的选择题或者简答题: 首先我们得知道概念: 前序遍历:先访问当前节点,再访问当前节点的左子树,最后访问当前节点的右子树.对于二叉树,深度遍历与此同.规律:根在前:子树在根后且左子树比右子树靠前,且第一个就是根节点: 中序遍历:先访问当前节点的左子树,然后访问当前节点,最后是当前节点的右子树,二叉树,中序遍历会得到数据升序效果.规律:根在中:左子树在跟左边

根据二叉树的先序遍历和中序遍历还原二叉树并且求二叉树的高度

#include<iostream> #include<string> using namespace std; string s1, s2; class Tree { public: char c; Tree *left; Tree *right; }; Tree* create() { Tree *p = new Tree; p->left = p->right = NULL; return p; } Tree* huanyuan(int x1, int x2, i

leetcode题解:Construct Binary Tree from Preorder and Inorder Traversal (根据前序和中序遍历构造二叉树)

题目: Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that duplicates do not exist in the tree. 说明: 1)二叉树可空 2)思路:a.根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0])为二叉树的根(root),  然后在中序序列(InSequence)中查找此根(

leetcode题解:Construct Binary Tree from Inorder and Postorder Traversal(根据中序和后序遍历构造二叉树)

题目: Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that duplicates do not exist in the tree. 说明: 1)实现与根据先序和中序遍历构造二叉树相似,题目参考请进 算法思想 中序序列:C.B.E.D.F.A.H.G.J.I 后序序列:C.E.F.D.B.H.J.I.G.A 递归思路: 根据后序遍历的特点,知道后序

leetcode 从前序与中序遍历构造一颗二叉树 深搜

根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder =?[3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / 9 20 / 15 7 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal 思路:前序遍历

[LeetCode] Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树

Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that duplicates do not exist in the tree. 这道题要求用先序和中序遍历来建立二叉树,跟之前那道Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树原理基本相同,针对这道题,由于先