根据后序遍历和中序遍历建树的方法
一,递归,每次将中序和后序重新按照根节点分割
/*** 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;}
};
根据后序遍历和中序遍历建树的方法相关推荐
- python实现二叉树遍历(前序遍历、中序遍历、后序遍历)
python实现二叉树遍历(前序遍历.中序遍历.后序遍历) 在计算机科学中,二叉树是一种树数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点.使用集合理论概念的递归定义是(非空)二叉树是元 ...
- 前序遍历与中序遍历确定后序遍历
1003. 二叉树后序遍历 Total: 137 Accepted: 80 Time Limit: 3sec Memory Limit:256MB Des ...
- 二叉树的前序遍历,中序遍历,后序遍历学习 (原)
经验: 不要死记各个遍历节点的位置,将一个复杂的二叉树当作一个个小的二叉树学习前序遍历,中序遍历,后序遍历会更容易理解 转载于:https://www.cnblogs.com/gyrgyr/p/962 ...
- 已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法
二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或 ...
- 树的前序遍历、中序遍历、后序遍历详解
1.前序遍历 对于当前节点,先输出该节点,然后输出他的左孩子,最后输出他的右孩子.以上图为例,递归的过程如下: (1):输出 1,接着左孩子: (2):输出 2,接着左孩子: (3):输出 4,左孩子 ...
- 数据结构与算法之二叉树的先序遍历,中序遍历,后序遍历
数据结构与算法之二叉树的先序遍历,中序遍历,后移遍历 目录 实现二叉树的先序,中序,后序遍历,包括递归方式和非递归方式 在二叉树中找到一个节点的后继节点 1. 实现二叉树的先序,中序,后序遍历,包括递 ...
- C实现二叉树的先序遍历,中序遍历,后序遍历
1 要创建的二叉树图 2 输出结果图 : 3 完整代码如下: #include<stdio.h> #include<malloc.h>//定义二叉树 typedef stru ...
- 【7-10 PAT】树的遍历(给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。)
题干: 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 解题报告: dfs求出这棵树来,然后bfs求层序遍历就行了. AC代码: #include&l ...
- C/C++二叉树前序遍历,中序遍历,后序遍历
二叉树的先序遍历,中序遍历,后序遍历 #include <iostream>using namespace std;typedef struct BTNode {char data;str ...
- 二叉树的创建、前序遍历、中序遍历、后序遍历
二叉树的创建.前序遍历.中序遍历.后序遍历 // BTree.cpp : Defines the entry point for the console application. /* 作者:成晓旭 ...
最新文章
- Python机器学习——Agglomerative层次聚类
- python中get和set使用_Python对象属性的set和get方法
- github+picGo+jsDelivr构建图床
- 矩阵的三角分解(LU)法(高斯消去法的矩阵形式分析)
- GVIM编辑器的配置
- 39、JAVA_WEB开发基础之ajax和json
- Java 中的volitle 关键字
- Unity整体与单个缩放比例
- 如何修改电脑微信的提示音(亲测有效)
- 线性代数学习笔记(二)——n阶行列式
- 输出今天是星期几并计算n天后的日期(万年历)
- 用黑莓手机来使电脑上网
- LDAP批量添加php页面,包含邮件发送
- 端游开发中用什么技术可以让用户更短时间内体验游戏?端游分发
- API服务平台,实现多个API的编排与聚合
- html中 导航条置顶的代码6,JS+CSS实现六级网站导航主菜单效果
- PEER地震波数据转化成lsdyna求解器格式曲线关键字方法
- 2021年【教师资格】流程全过程
- 郑义宣就任韩国现代汽车集团会长
- leetcode之股票问题