一,递归,每次将中序和后序重新按照根节点分割

/*** 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* buildTree(vector<int>& inorder, vector<int>& postorder) {if(inorder.size()!=postorder.size()||!inorder.size()){return NULL;}int value = postorder.back();TreeNode * root = new TreeNode(value);postorder.pop_back();//修改 中序和 后序//修改中序int len = inorder.size();int mark = 0;vector<int> newleft,newright;for(int i=0;i<len;i++){if(value == inorder[i]){mark = i;}}newleft.assign(inorder.begin(),inorder.begin()+mark);newright.assign(inorder.begin()+mark+1,inorder.end());//修改后序vector<int> rnewleft,rnewright;if(newleft.size()){rnewleft.assign(postorder.begin(),postorder.begin()+newleft.size());}if(newright.size()){rnewright.assign(postorder.begin()+newleft.size(),postorder.end());}root->left = buildTree(newleft,rnewleft);root->right = buildTree(newright,rnewright);return root;}
};

方法二:迭代

思路

迭代法是一种非常巧妙的实现方法。迭代法的实现基于以下两点发现。

如果将中序遍历反序,则得到反向的中序遍历,即每次遍历右孩子,再遍历根节点,最后遍历左孩子。
如果将后序遍历反序,则得到反向的前序遍历,即每次遍历根节点,再遍历右孩子,最后遍历左孩子。

「反向」的意思是交换遍历左孩子和右孩子的顺序,即反向的遍历中,右孩子在左孩子之前被遍历。

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/solution/cong-zhong-xu-yu-hou-xu-bian-li-xu-lie-gou-zao-14/

class Solution {public:TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {if (postorder.size() == 0) {return nullptr;}auto root = new TreeNode(postorder[postorder.size() - 1]);auto s = stack<TreeNode*>();s.push(root);int inorderIndex = inorder.size() - 1;for (int i = int(postorder.size()) - 2; i >= 0; i--) {int postorderVal = postorder[i];auto node = s.top();if (node->val != inorder[inorderIndex]) {node->right = new TreeNode(postorderVal);s.push(node->right);} else {while (!s.empty() && s.top()->val == inorder[inorderIndex]) {node = s.top();s.pop();inorderIndex--;}node->left = new TreeNode(postorderVal);s.push(node->left);}}return root;}
};

根据后序遍历和中序遍历建树的方法相关推荐

  1. python实现二叉树遍历(前序遍历、中序遍历、后序遍历)

    python实现二叉树遍历(前序遍历.中序遍历.后序遍历) 在计算机科学中,二叉树是一种树数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点.使用集合理论概念的递归定义是(非空)二叉树是元 ...

  2. 前序遍历与中序遍历确定后序遍历

    1003. 二叉树后序遍历     Total: 137 Accepted: 80                 Time Limit: 3sec    Memory Limit:256MB Des ...

  3. 二叉树的前序遍历,中序遍历,后序遍历学习 (原)

    经验: 不要死记各个遍历节点的位置,将一个复杂的二叉树当作一个个小的二叉树学习前序遍历,中序遍历,后序遍历会更容易理解 转载于:https://www.cnblogs.com/gyrgyr/p/962 ...

  4. 已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

    二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或 ...

  5. 树的前序遍历、中序遍历、后序遍历详解

    1.前序遍历 对于当前节点,先输出该节点,然后输出他的左孩子,最后输出他的右孩子.以上图为例,递归的过程如下: (1):输出 1,接着左孩子: (2):输出 2,接着左孩子: (3):输出 4,左孩子 ...

  6. 数据结构与算法之二叉树的先序遍历,中序遍历,后序遍历

    数据结构与算法之二叉树的先序遍历,中序遍历,后移遍历 目录 实现二叉树的先序,中序,后序遍历,包括递归方式和非递归方式 在二叉树中找到一个节点的后继节点 1. 实现二叉树的先序,中序,后序遍历,包括递 ...

  7. C实现二叉树的先序遍历,中序遍历,后序遍历

    1  要创建的二叉树图 2 输出结果图 : 3 完整代码如下: #include<stdio.h> #include<malloc.h>//定义二叉树 typedef stru ...

  8. 【7-10 PAT】树的遍历(给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。)

    题干: 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 解题报告: dfs求出这棵树来,然后bfs求层序遍历就行了. AC代码: #include&l ...

  9. C/C++二叉树前序遍历,中序遍历,后序遍历

    二叉树的先序遍历,中序遍历,后序遍历 #include <iostream>using namespace std;typedef struct BTNode {char data;str ...

  10. 二叉树的创建、前序遍历、中序遍历、后序遍历

    二叉树的创建.前序遍历.中序遍历.后序遍历 // BTree.cpp : Defines the entry point for the console application. /*  作者:成晓旭 ...

最新文章

  1. Python机器学习——Agglomerative层次聚类
  2. python中get和set使用_Python对象属性的set和get方法
  3. github+picGo+jsDelivr构建图床
  4. 矩阵的三角分解(LU)法(高斯消去法的矩阵形式分析)
  5. GVIM编辑器的配置
  6. 39、JAVA_WEB开发基础之ajax和json
  7. Java 中的volitle 关键字
  8. Unity整体与单个缩放比例
  9. 如何修改电脑微信的提示音(亲测有效)
  10. 线性代数学习笔记(二)——n阶行列式
  11. 输出今天是星期几并计算n天后的日期(万年历)
  12. 用黑莓手机来使电脑上网
  13. LDAP批量添加php页面,包含邮件发送
  14. 端游开发中用什么技术可以让用户更短时间内体验游戏?端游分发
  15. API服务平台,实现多个API的编排与聚合
  16. html中 导航条置顶的代码6,JS+CSS实现六级网站导航主菜单效果
  17. PEER地震波数据转化成lsdyna求解器格式曲线关键字方法
  18. 2021年【教师资格】流程全过程
  19. 郑义宣就任韩国现代汽车集团会长
  20. leetcode之股票问题

热门文章

  1. 启动nginx后出现welcome to centos
  2. JAVA课程设计——小学数学练习
  3. mysql 主从同步master主数据库无法写入
  4. 8 亿邮件地址泄露,源于邮件验证服务;腾讯推出微信公众号直播工具
  5. 常用的设计模式(七)——门面设计模式
  6. 今日金融词汇--- TO G 业务,是什么
  7. 微信有没有免费提现服务器,微信有没有免费提现的方法 教你三个微信提现的小技巧...
  8. 聊聊C++任务定时器的设计与具体实现
  9. 组织能力建设的三部曲
  10. 有线耳机真成了“时代的弃儿”?