您的位置:首页 > Web前端

【剑指offer】 重建二叉树

2017-04-07 21:15 489 查看

摘要

剑指offer面试题5:



二叉树的节点的定义如下:

struct  BinaryTreeNode
{
int _data;//二叉树数据
BinaryTreeNode*  _left;//左孩子指针
BinaryTreeNode*  _right;//右孩子指针
BinaryTreeNode(const  int data)
:_data(data)
,_left(NULL)
,_right(NULL)
{}
};

解决方法:

在二叉树中 ,,,

前序遍历------就是   先访问的是根节点,再访问左边节点,最虎访问的是 右边节点

中序遍历------就是   先访问的是左边节点,再访问根节点,最后访问的是 右边节点

我们先来分析一下这个题 :

二叉树的先序遍历 第一个遍历的节点 一定是  根节点

二叉树的中序遍历 首先遍历的节点是  一定是 根节点的左子树

那么 、、、前序遍历结果和中序遍历的结果   就可以分成三部分   如下图所示:



通过前序遍历和中序遍历的特点,,我们已经可以初步得到该二叉树的  三部分:

1、根节点  
2、左右 子树的前序遍历序列;
3、左右子树的中序遍历序列。

分析到此处、、、我们很多的人都会想到   使用递归,,,,  
将左右子树的前中序遍历出 当成是    一颗 二叉树的  前中序遍 历    来说重建二叉树 ,并将建成的二叉树的根节点当做是      原根节点的左右孩子。。。

说道此处,这道题的解法也大致出来了。。。
下面我们来用代码实现一下吧!!!!!!!!!!
//

typedef  BinaryTreeNode  Node;

//[ Prefirst,Prelast]
//实现一个二叉树的递归算法
// 前序序列[ Prefirst,Prelast] 中序序列 [Infirst,Inlast];
Node* _CreateNewTree(int* Prefirst,int * Prelast,int*  Infirst,int *Inlast)
{
if(Prefirst==Prelast )//当序列只有一个值时,表示当前的字数只有一个节点
return new Node(*Prefirst);//直接返回一个节点
int value = *Prefirst;//得到根节点的  value值
Node * node= new Node(value);//建立当前子树的根节点
//找到当前树  它的左右子树的节点个数
int * first = Infirst;
int * last = Inlast;
for(; first<= last;++first)
{
if(*first == value)
break;
}
if(first > last)
assert(false);
int  n = first - Infirst;//n表示的是左子树的节点个数
if(first != Infirst)//要是当前树的左子树没有一个节点,,,,就不需要进入递归了。
node->_left = _CreateNewTree(Prefirst+1,Prefirst+n,Infirst,first-1);
if(first != Inlast)//要是当前树的右子树没有一个节点,,,,就不需要进入递归了。
node->_right = _CreateNewTree(Prefirst+ n+1,Prelast,first+1,Inlast);
return  node;
}
Node*  CreateNewTree(int *  Pre,int * In,int length)
{
assert(Pre&&In);
assert(length);//
return  _CreateNewTree(Pre,Pre+length-1,In,In+length-1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 面试题 递归