剑值offer(4)-重建二叉树
2016-06-05 10:56
267 查看
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路
在二叉树的前序遍历中,第一个数字总是树的根结点的值。但在中序遍历中,根结点的值在序列的中间,作子树的结点的值位于根结点的左边,而右子树的结点的值位于根结点的值的右边。代码
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) { long inLength = in.size(); if (inLength == 0) { return NULL; } vector<int> left_pre,right_pre,left_in,right_in; // 创建根结点,根结点肯定是前序遍历的第一个数 TreeNode* head = new TreeNode(pre[0]); // 找到中序遍历根结点所在位置,存放于变量gen中 int gen = 0; for (int i=0; i<inLength; i++) { if (in[i] == pre[0]) { gen = i; break; } } // 对于中序遍历,根结点左边的结点位于二叉树的左边,根结点右边的结点位于二叉树的右边。 // 利用上述这点。对二叉树结点进行归并 for (int i=0; i<gen; i++) { left_in.push_back(in[i]); left_pre.push_back(pre[i+1]); } for (int i=gen+1; i<inLength; i++) { right_in.push_back(in[i]); right_pre.push_back(pre[i]); } // 递归 head->left = reConstructBinaryTree(left_pre, left_in); head->right = reConstructBinaryTree(right_pre, right_in); return head; } };
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- 文件遍历排序函数
- Lua 学习笔记之C API 遍历 Table实现代码
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- Erlang中遍历取出某个位置的最大值代码
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- php遍历目录方法小结
- 一个目录遍历函数
- php遍历删除整个目录及文件的方法
- PHP遍历文件夹与文件类及处理类用法实例
- PHP遍历XML文档所有节点的方法
- 平衡二叉树
- 二叉树