二叉查找树的前序遍历,后序遍历和中序遍历互求算法模板
Posted PhiliAI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉查找树的前序遍历,后序遍历和中序遍历互求算法模板相关的知识,希望对你有一定的参考价值。
面试的痛
前几天去阿里面试,一时忘记了二叉树的前序遍历中序遍历和后序遍历的概念,已经想死了。
然后最近去腾讯面试,被问到怎么已知前序遍历/后序遍历 + 中序遍历,求后序遍历/前序遍历,看来这种问题很喜欢考。
其实这个问题想清楚了很简单,只要把这三个概念理解透彻就可以做出来了,比如前序遍历的第一个值一定是根节点,然后这个根节点对应到中序遍历里面,在中序遍历的这个值的两边的值,一定在以此节点为根节点的两个子树上,同理,后序遍历也一样。
已知前序遍历和后序遍历是不能求唯一的中序遍历树的。
#include <iostream>
#include <string>
using std::string;
template<typename _Val>
struct TreeNodeBase
{
TreeNodeBase *left;
TreeNodeBase *right;
_Val val;
};
//已知前序遍历和中序遍历,找后序遍历
template<typename _Iter, typename _sizeType, typename _TreeNodeType = TreeNodeBase<char>>
_TreeNodeType *preOrderInfixOrderToSufixOrder(_Iter &pre, _Iter &in, _sizeType length)
{
if (length == 0)
return nullptr;
auto node = new _TreeNodeType;
_sizeType index = 0;
for (; index != length; index++)//找到对应的前序遍历的点
if (*(in + index) == *(pre))
break;
node->left = preOrderInfixOrderToSufixOrder(pre + 1, in, index);
node->right = preOrderInfixOrderToSufixOrder(pre + index + 1, in + index + 1, length - (index + 1));
node->val = *pre;
std::cout << node->val << " ";
return node;
}
//已知后序遍历和中序遍历,找前序遍历
template<typename _Iter, typename _sizeType, typename _TreeNodeType = TreeNodeBase<char>>
_TreeNodeType *sufixOrderInfixOrderToPreOrder(_Iter &sufix, _Iter &in, _sizeType length)
{
if (length == 0)
return nullptr;
auto node = new _TreeNodeType;
node->val = *(sufix + length - 1);
std::cout << node->val << " ";
_sizeType index = 0;
for (;index != length ;index++)
if (*(in + index) == *(sufix + length - 1))
break;
node->left = sufixOrderInfixOrderToPreOrder(sufix, in, index);
node->right = sufixOrderInfixOrderToPreOrder(sufix + index, in + index + 1, length - (index + 1));
return node;
}
/*
//已知前序遍历/后序遍历 + 中序遍历求后序遍历/前序遍历
int main()
{
string preOrder("GDAFEMHZ");
string infixOrder("ADEFGHMZ");
string sufixOrder("AEFDHZMG");
auto root1 = preOrderInfixOrderToSufixOrder(preOrder.begin(), infixOrder.begin(), preOrder.size());
std::cout << std::endl;
auto root2 = sufixOrderInfixOrderToPreOrder(sufixOrder.begin(), infixOrder.begin(), preOrder.size());
system("pause");
return 0;
}*/
以上是关于二叉查找树的前序遍历,后序遍历和中序遍历互求算法模板的主要内容,如果未能解决你的问题,请参考以下文章
二叉树进阶题------前序遍历和中序遍历构造二叉树;中序遍历和后序遍历构造二叉树
二叉树进阶题------前序遍历和中序遍历构造二叉树;中序遍历和后序遍历构造二叉树