摘要
剑指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);
}