题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
# -*- 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)的更多相关文章

  1. 用前序和中序重建二叉树 python

    程序实现了用二叉树的前序遍历序列和中序遍历序列重建二叉树,代码用python实现. 首先定义二叉树节点的类: class TreeNode: def __init__(self, x): self.v ...

  2. 利用层序遍历(含空节点)和中序遍历重建二叉树 python

    给定一颗二叉树的层序遍历(不含None的形式)和中序遍历序列,利用两个序列完成对二叉树的重建. 还是通过一个例子来说明整个过程,下图所示的二叉树,层序遍历结果为[a,b,c,d,e],中序遍历结果为[ ...

  3. 层序遍历二叉树 完整层序重建二叉树 python

    给定一个二叉树的完整的层次遍历序列(包含所有节点,包括空节点),利用这个序列生成一颗二叉树. 我们首先来看怎样对一颗二叉树进行层序遍历,下图所示的二叉树层次遍历的结果为[a,b,c,d,e],在这个过 ...

  4. 【算法编程 C++ Python】根据前序遍历、中序遍历重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  5. 重建二叉树[by Python]

    题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2 ...

  6. 剑指offer——python【第4题】重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  7. 《剑指offer》重建二叉树

    本题来自<剑指offer> 重构二叉树 题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2 ...

  8. 剑指Offer 4. 重建二叉树 (二叉树)

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  9. 剑指offer4:重建二叉树(后序遍历)

    1. 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4 ...

随机推荐

  1. python 3.4 error: Microsoft Visual C++ 10.0 is required(Unable to find vcvarsall.bat)

    一些小技巧 我是在windows 64下安装的python3.4 Python 我在安装theano时报这个错,网上找了不少资料.自己摸索着解决了. 你先打开dos界面.我用set命令查看一下: 发现 ...

  2. TypeError: 'range' object doesn't support item deletion

    python 是个逐步迭代开发的过程,他不是向下兼容的,更不是向上兼容,版本不一致,好端端的程序就是不能运行了. 下面是在python 2中能运行,在Python 3中不能运行的代码.其实也很简单.但 ...

  3. react-native ios 集成 react-native-baidu-map

    自己测试了下,https://www.jianshu.com/p/eceb7e66fa5e?appinstall=0 记录下自己遇到的问题,以及解决方法, 首先新建一个react native项目,然 ...

  4. jsfl完成通知air

    jsfl完成后生成一个文本A.txt, air开始jsfl执行后一直检测A.txt是否存在,存在就是完成了.那么就可以删除这个A.txt

  5. windowsAPI之OpenProcessToken,AdjustTokenPrivileges 和LookupPrivilegeValue<转>

    这三个函数主要用来提升进程的权限 1 OpenProcessToken()函数:获取进程的令牌句柄 OpenProcessToken的原型. BOOL WINAPI OpenProcessToken( ...

  6. Django - cookies 会话跟踪技术

    一.HTTP协议的无状态保存 两次请求之间没有关联 会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应 2.会话路径技术使用Cookie或session完成 我们知道HTTP ...

  7. css:清楚浮动

    这个清楚浮动的方法最常用,给浮动字元素的父盒子,也就是不浮动元素,添加一个lhearfix的类,其类的css样式为: .clearfix:after{ /*必须要写这三句话*/ content:''; ...

  8. js Json数组的增删改查

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  9. JULIA BOORSTIN — Interview a Broadcaster!

    JULIA BOORSTIN — Interview a Broadcaster! Share Tweet Share Tagged With: Interview a Broadcaster Stu ...

  10. Linux性能测试分析命令_vmstat

    vmstat命令主要是对操作系统的虚拟内存.进程.IO读写.CPU活动等整体情况进行统计.但是它不能对某个进程进行深入分析. vmstat基本语法 命令使用格式:vmstat [options] [d ...