《剑指offer》重建二叉树
本题来自《剑指offer》 重构二叉树
题目:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:
二叉树的前序遍历:根左右,第一个值是根节点
二叉树的中序遍历:左根右,根节点的值在中间,左子树的节点在根的左边,右子树的节点在根的右边
首先找到前序的根节点,继而对应到中序中,分离出中序的根左、右子树。
其次对中序的左右子树,对应的找到前序的左右子树。
左、右子树同样是数,所以采用递归的思路进行遍历。
终止条件,当前序只有一个值时候,便是根节点,当没有值就返回None。
C++ Code:(未调通,栈溢出,是边界条件没有调好,后期改)
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
if (pre.size() == ){ //当前序为空时候,返回为空
return NULL;
}else if(pre.size() == ){ //当只有一个元素时候,便直接是根节点
TreeNode* root = new TreeNode(pre[]);
return root;
}else{
std::vector<int> vin_left,vin_right,pre_left,pre_right; //定义前序和中序的左右子节点
for (int i = ;vin[i]!=pre[];i++){ //中序的左节点
vin_left.push_back(vin[i++]);
}
for (int i = vin_left.size()+;i<vin.size();i++){ //中序的右子节点
vin_right.push_back(vin[i]);
}
for (int i = ;i<vin_left.size();i++){ //前序的左子节点
pre_left.push_back(pre[i]);
}
for (int i = pre_left.size()+;i<pre.size();i++){ //前序的右子节点
pre_right.push_back(pre[i]);
}
TreeNode* root = new TreeNode(pre[]); //构造根节点,其值就是前序的第一个值
root->left = reConstructBinaryTree(pre_left,vin_left); //左节点是递归的调用,前左子节点和中左子节点
root->right = reConstructBinaryTree(pre_right,vin_right);//右节点是递归的调用,前右子节点和中右子节点
return root; //将其返回
} }
};
Python Code:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
# write code here
if len(pre) == 0: #当数据中没有数据返回None
return None
elif len(pre) == 1: #当前序中只有一个数时,则为根节点,直接返回
return TreeNode(pre[0])
else:
tin_left = tin[:tin.index(pre[0])] #中序的左子树为从头到前序的根节点
tin_right = tin[tin.index(pre[0])+1:] #中序的右子树为从根节点到尾部全部
pre_left = pre[1:len(tin_left)+1] #前序的左子树为从根节点开始到中序的左子树
pre_right = pre[len(tin_left)+1:] #前序的右子树为中序的右子树
res = TreeNode(pre[0]) #定义根节点
res.left = Solution.reConstructBinaryTree(self,pre_left,tin_left) #递归的调用左子树
res.right = Solution.reConstructBinaryTree(self,pre_right,tin_right)#递归的调用右子树
return res #最终返回根节点
# -*- coding: utf-8 -*-
"""
Created on Mon Apr 8 14:18:46 2019 @author: Administrator
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路:
前序的第一个为根节点,依次找到其左节点的放在一起,右节点的放在一起,递归计算
""" class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
# write code her
if len(pre) == 0: #如果没有节点就直接返回None
return None
elif len(pre) == 1: #如果只有一个节点就直接是头结点了,直接返回
return TreeNode(pre[0])
else:
tin_left = tin[:tin.index(pre[0])] #截取中左区域
tin_right = tin[tin.index(pre[0])+1:] #截取中右区域
pre_left = pre[1:len(tin_left)+1] #截取前左区域
pre_right = pre[len(tin_left)+1:] #截取前右区域
res = TreeNode(pre[0]) #头结点为前的第0个节点
res.left = Solution.reConstructBinaryTree(self,pre_left,tin_left) #递归,左节点是前左和中左
res.right = Solution.reConstructBinaryTree(self,pre_right,tin_right)#递归,右节点是前右和中右
return res
#前序遍历
def preorder(self,node):
if node:
print(node.val)
Solution.preorder(self,node.left)
Solution.preorder(self,node.right)
# 中序遍历
def inorder(self,node):
if node:
Solution.inorder(self,node.left)
print(node.val)
Solution.inorder(self,node.right)
#后序遍历
def postorder(self,node):
if node:
Solution.postorder(self,node.left)
Solution.postorder(self,node.right)
print(node.val)
if __name__ == '__main__':
pre = [1,2,4,7,3,5,6,8]
tin = [4,7,2,1,5,3,8,6]
solution = Solution()
tree = solution.reConstructBinaryTree(pre,tin)
solution.preorder(tree)
总结:
发现规律,终止和其实条件。
《剑指offer》重建二叉树的更多相关文章
- 剑指Offer——重建二叉树
题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7 ...
- 剑指Offer——重建二叉树2
Question 输入某二叉树的后序遍历和中序遍历的结果,请重建出该二叉树.假设输入的后序遍历和中序遍历的结果中都不含重复的数字.例如输入后序遍历序列{1, 3, 4, 2}和中序遍历序列{1, 2, ...
- 用js刷剑指offer(重建二叉树)
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 剑指offer 重建二叉树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- 《剑指offer》 二叉树的镜像
本题来自<剑指offer>二叉树的镜像 题目: 操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 ...
- 剑指Offer:二叉树打印成多行【23】
剑指Offer:二叉树打印成多行[23] 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题目分析 Java题解 package tree; import java.uti ...
- 剑指Offer:二叉树中和为某一值的路径【34】
剑指Offer:二叉树中和为某一值的路径[34] 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. ...
- 剑指 Offer 34. 二叉树中和为某一值的路径 + 记录所有路径
剑指 Offer 34. 二叉树中和为某一值的路径 Offer_34 题目详情 题解分析 本题是二叉树相关的题目,但是又和路径记录相关. 在记录路径时,可以使用一个栈来存储一条符合的路径,在回溯时将进 ...
- 剑指 Offer 34. 二叉树中和为某一值的路径
剑指 Offer 34. 二叉树中和为某一值的路径 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下 ...
- 力扣 - 剑指 Offer 27. 二叉树的镜像
题目 剑指 Offer 27. 二叉树的镜像 思路1(递归) 我们可以使用深度优先搜索,先递归到链表的末尾,然后从末尾开始两两交换.就相当于后续遍历而已 记得要先保存下来node.right节点,因为 ...
随机推荐
- 「NowCoder Contest 295」H. Playing games
还是见的题太少了 「NowCoder Contest 295」H. Playing games 题意:选出尽量多的数使得异或和为$ 0$ $ Solution:$ 问题等价于选出尽量少的数使得异或和为 ...
- LR-Controller 如何自定义显示虚拟用户状态
我们压测时,如何直观,实时地查看当前运行账号和迭代情况呢. 在运行脚本中添加一行代码就解决了~~~~~~~~~~~
- npm 常用命令详解(转载)
学习gulp的使用时,对npm的掌握是必不可少的,经常到npm官网查询文档让我感到不爽,还不如整理了一些常用的命令博客上,于是根据自己的理解简单翻译过来,终于有点输出,想学习npm这块的朋友不可错过这 ...
- 【Math for ML】向量微积分(Vector Calculus)
I. 向量梯度 假设有一个映射函数为\(f:R^n→R^m\)和一个向量\(x=[x_1,...,x_n]^T∈R^n\),那么对应的函数值的向量为\(f(x)=[f_1(x),...,f_m(x)] ...
- 关于VXLAN的认识-----基础知识
一.什么是VXLAN 普通的VLAN数量只有4096个,无法满足大规模云计算IDC的需求,因为目前大部分IDC内部结构主要分为两种L2,L3. L2结构里面,所有的服务器都在一个大的局域网里面,TOR ...
- JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
https://blog.csdn.net/u012882327/article/details/69525166
- oracle监听器初识-配置多SERVICE_NAMES
现象: 为数据库设置多个服务名(通过SCOPE=both设置,同时修改参数文件) SQL> show parameter service_names; NAME TYPE VALUE ----- ...
- CF1110D Jongmah
题目地址:CF1110D Jongmah 约定:称形如 \([a-1,a,a+1]\) 这样的三元组为关于 \(a\) 的顺子,形如 \([a,a,a]\) 这样的三元组为关于 \(a\) 的对子. ...
- [Kubernetes]CentOS7下搭建Harbor仓库
环境依赖: Harbor仓库需要环境:Python 2.7或以上版本,Docker 1.10或以上,Docker Compose 1.6.0或以上. CentOS7自带Python,所以不需要安装. ...
- python3+selenium入门01-环境搭建
作为一个测试,在最近两年应该有明显的感觉.那就是工作变的难找,要求变的高了,自动化测试,性能测试等.没有自动化测试能力,只会点点点工作难找不说,工资也不高.所以还是要学习一些技术.首先要学习一门编程语 ...