重建二叉树(剑指offer)
来源:互联网 发布:tomcat和apache的区别 编辑:程序博客网 时间:2024/06/07 11:53
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
1、二叉树相关
1.1、二叉树节点定义
typedef struct TreeNode{ int val; struct TreeNode *left; struct TreeNode *next; }TNode;
1.2、二叉树前序遍历
void preOrder(TNode *node){ if(!node) return; cout<<node->val<<" "; preOrder(node->left); preOrder(node->right);}
1.3、二叉树中序遍历
void inOrder(TNode *node){ if(!node) return; inOrder(node->left); cout<<node->val<<" "; inOrder(node->right);}
1.4、二叉树后序遍历
void posOrder(TNode *node){ if(!node) return; posOrder(node->left); posOrder(node->right); cout<<node->val<<" ";}
2、根据前序遍历与中序遍历重建二叉树
TNode* reConstructBinaryTree(vector<int> pre,vector<int> in){ //如果pre与in任一个为空则返回空 if(pre.empty() || in.empty()) return NULL; //新建结点,以当前前序遍历的第一个值为当前子树根结点的值 TNode *node = new TreeNode(); node->val = pre[0]; //求左子树前序遍历(preLeft)和中序遍历(InLeft) vector<int> preLeft; vector<int> InLeft; int i = 0; while(pre[0] != in[i] && i < (int)in.size()) { preLeft.push_back(pre[i+1]); InLeft.push_back(in[i]); i++; } //求右子树前序遍历(preRight)和中序遍历(InRight) i++; vector<int> preRight; vector<int> InRight; while(i < (int)in.size()) { preRight.push_back(pre[i]); InRight.push_back(in[i]); i++; } //重建左子树 node->left = reConstructBinaryTree(preLeft,InLeft); //重建右子树 node->right = reConstructBinaryTree(preRight,InRight); return node;}
3、演示
#include <vector>#include <iostream>using namespace std;int main(int argc, char **argv){ vector<int> pre = {1,2,4,7,3,5,6,8}; vector<int> in = {4,7,2,1,5,3,8,6}; TNode *pp =reConstructBinaryTree(pre,in); //前序遍历 cout<<"前序遍历:"; preOrder(pp); cout<<endl; //中序遍历 cout<<"中序遍历:"; inOrder(pp); cout<<endl; //后序遍历 cout<<"后序遍历:"; posOrder(pp); cout<<endl; return 0;}
输出:
前序遍历:1 2 4 7 3 5 6 8 中序遍历:4 7 2 1 5 3 8 6 后序遍历:7 4 2 5 8 6 3 1
0 0
- 剑指offer(5):重建二叉树
- 重建二叉树(剑指offer)
- 剑指offer(四)重建二叉树
- (剑指offer)重建二叉树
- 剑指offer--(4) 重建二叉树
- 剑指offer---重建二叉树(6)
- 剑指Offer(四)重建二叉树
- [剑指offer]重建二叉树
- 【剑指offer】重建二叉树
- 剑指offer--重建二叉树
- 剑指offer---重建二叉树
- 剑指Offer-重建二叉树
- 剑指offer:重建二叉树
- 剑指offer-重建二叉树
- 《剑指offer》重建二叉树
- 【剑指Offer】重建二叉树
- 剑指offer-重建二叉树
- 《剑指offer》-重建二叉树
- 如何构建自己的交易系统
- linux下python 发送邮件,并通过C++调用
- 前端告别浏览器F5刷新
- quartz定时任务触发器
- Android中的屏幕以及单位问题
- 重建二叉树(剑指offer)
- SpringMVC返回json数据
- ADC动态范围的计算
- requeset&&response
- 堆栈的深入个人理解
- Javascript: 实现拼图游戏
- Problem C. Recursive sequence
- Android实战——之反序列化实例
- 思想建设是获得巨大成功的前提条件