重建二叉树(python)
题目描述
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回构造的TreeNode根节点
#采用递归的思想。根据前序遍历和中序遍历来构建二叉树的思路:前序遍历的第一个则是二叉树的根,
#找到根在中序遍历中的位置,则根将中序遍历分为了两部分,根的左边为二叉树的左子树,
#根的右边为二叉树的右子树,对应左右子树在可前序遍历中是连续存在的,
#根据该思路可以继续分别寻找左子树与右子树的根节点,递归进行。
#判断二叉树是否为空,进行长度的判断即可。
#还要注意将根定义成节点的形式。在进行本函数的递归调用时,需要在本函数名前面加上self.。
def reConstructBinaryTree(self, pre, tin):
# write code here
if len(pre) == 0:
return None
root_data = TreeNode(pre[0])
i=tin.index(pre[0])
root_data.left =self.reConstructBinaryTree(pre[1:1+i],tin[:i])
root_data.right =self.reConstructBinaryTree(pre[1+i:],tin[1+i:])
return root_data
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
vector<int>pre_1;
vector<int>vin_1;
void build(TreeNode* node, int l1, int r1, int l2, int r2)
{
if (l1>r1 || l2>r2)
{
return;
}
int i, l_ans, r_ans;
int number = pre_1[l1];
for (i = l2; i <= r2; i++)
{
if (vin_1[i] == number)
{
break;
}
}
l_ans = i - l2;
r_ans = r2 - i;
if (l_ans > 0)
{
TreeNode* temp = (TreeNode*)malloc(sizeof(TreeNode));
temp->val = pre_1[l1 + 1];
temp->left = temp->right = NULL;
node->left = temp;
build(temp, l1 + 1, l1 + l_ans, l2, i - 1);
}
if (r_ans > 0)
{
TreeNode* temp = (TreeNode*)malloc(sizeof(TreeNode));
temp->val = pre_1[l1 + l_ans + 1];
temp->left = temp->right = NULL;
node->right = temp;
build(temp, l1 + l_ans + 1, r1, i + 1, r2);
}
}
TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin)
{
TreeNode *head = NULL;
if (pre.size() == 0)
{
return head;
}
TreeNode* temp = (TreeNode*)malloc(sizeof(TreeNode));
temp->val = pre[0];
temp->left = temp->right = NULL;
head = temp;
pre_1 = pre;
vin_1 = vin;
build(head, 0, pre.size() - 1, 0, vin.size() - 1);
return head;
}
};
void display(TreeNode* node)
{
if (node == NULL)
{
return;
} display(node->left);
display(node->right);
cout << node->val << " ";
}
int main()
{
TreeNode *c;
Solution s;
int a[15] = { 1, 2, 4, 7, 3, 5, 6, 8 };
int b[15] = { 4, 7, 2, 1, 5, 3, 8, 6 };
vector<int> pre(a, a + 8);
vector<int> vin(b, b + 8);
c = s.reConstructBinaryTree(pre, vin);
display(c);
cout << endl;
system("pause");
return 0;
}
重建二叉树(python)的更多相关文章
- 用前序和中序重建二叉树 python
程序实现了用二叉树的前序遍历序列和中序遍历序列重建二叉树,代码用python实现. 首先定义二叉树节点的类: class TreeNode: def __init__(self, x): self.v ...
- 利用层序遍历(含空节点)和中序遍历重建二叉树 python
给定一颗二叉树的层序遍历(不含None的形式)和中序遍历序列,利用两个序列完成对二叉树的重建. 还是通过一个例子来说明整个过程,下图所示的二叉树,层序遍历结果为[a,b,c,d,e],中序遍历结果为[ ...
- 层序遍历二叉树 完整层序重建二叉树 python
给定一个二叉树的完整的层次遍历序列(包含所有节点,包括空节点),利用这个序列生成一颗二叉树. 我们首先来看怎样对一颗二叉树进行层序遍历,下图所示的二叉树层次遍历的结果为[a,b,c,d,e],在这个过 ...
- 【算法编程 C++ Python】根据前序遍历、中序遍历重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 重建二叉树[by Python]
题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2 ...
- 剑指offer——python【第4题】重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 《剑指offer》重建二叉树
本题来自<剑指offer> 重构二叉树 题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2 ...
- 剑指Offer 4. 重建二叉树 (二叉树)
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 剑指offer4:重建二叉树(后序遍历)
1. 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4 ...
随机推荐
- 10. eclipse在选中一个变量之后,怎样让所有相同的变量都有灰色背景显示
是在window->Preferences->Java->Editor->Mark Occurrences里面设置打钩就行了
- 转载:python 的包导入
python 包 多个关系密切的模块应该组织成一个包,以便于维护和使用.这项技术能有效避免名字空间冲突.创建一个名字为包名字的文件夹并在该文件夹下创建一个__init__.py 文件就定义了一个包.你 ...
- MVC基于角色权限控制--管理角色
管理角色分为 添加角色.删除角色.修改角色.给角色分配权限(修改角色权限) 新建RoleInfoController继承BaseController namespace CZBK.ItcastOA.W ...
- PHP单点登陆
本文主要介绍了利用webservice,session,cookie技术,来进行通用的单点登录系统的分析与设计.具体实现语言为PHP.单点 登录,英文名为Single Sign On,简称为 SSO, ...
- 完美解决ubuntu下sublime中文输入问题
声明 1.本人整理文章,转载请注明出处. 2.参考资料 http://my.oschina.net/tsl0922/blog/113495 问题描述 在ubuntu下想使用sublime,但是不能输入 ...
- JSdom操作内容,样式,属性
<p> JavaScript 能够直接写入 HTML 输出流中: </p> <script> document.write("<h1>This ...
- BlockingQueue之DelayQueue的学习使用
DelayQueue 是一中阻塞队列,需要实现接口Delayed定义的方法.做下使用记录和心得吧, @Datapublic class DelayQueueExample implements Del ...
- docker之docker-machine用法
转自:https://www.cnblogs.com/jsonhc/p/7784466.html docker-machine 是docker官方提供的docker管理工具.通过docker-mach ...
- Homebrew安装与使用
Homebrew是什么? 官方解释: Homebrew是以最简单,最灵活的方式来安装苹果公司在MacOS中不包含的UNIX工具. 官网:传送门 Git仓库地址:传送门 Homebrew 怎么安装 ?怎 ...
- spring boot 开发非web应用程序