情景1:给定一个二叉树的先序遍历序列和中序遍历序列,恢复这棵树。
例:先序:abdecfg
中序:dbeafcg
思路:由于先序遍历顺序是根左右,所以先序遍历序列的第一个肯定是根,然后在中序序列中找到这个根,中序遍历顺序为左根右,那么根左边是左子树,右边为右子树,如图示:
代码如下:
class Node
{
public:
Node():m_left(NULL),m_right(NULL){}
Node(char v) :m_value(v), m_left(NULL), m_right(NULL) {}
char m_value;
Node* m_left;
Node* m_right;
};
class Tree
{
public:
Tree():m_root(NULL){}
//n是当前所操作字符串大小
void CreatePreIn(Node*& root, const char* vlr, const char* lvr, int n)
{
//当左右结点个数为0时,说明到叶子结点了
if (n == 0)
root = NULL;
else
{
/*
前序遍历的第一个vlr[0]即是根,在中序遍历中查找根的位置,将中序遍历分成左右两部分
*/
int k = 0;
while (vlr[0] != lvr[k])
{
k++;
//k所在位置