题目:EPI
提示:
该二叉树储存的数据类型是string,输入的前序遍历数组中,若为 “null”,则表示该节点为空指针,否则表示该节点的储存数据。
template<typename T>
class BinaryTree
{
public:
T val;
shared_ptr<BinaryTree<T>> left, right;
BinaryTree(T d, shared_ptr<BinaryTree<T>> l, shared_ptr<BinaryTree<T>> r) :val(d), left(l), right(r){}
BinaryTree(T d) :val(d), left(nullptr), right(nullptr){}
BinaryTree(){}
};
typedef shared_ptr<BinaryTree<string>> treeptr;
treeptr reconstruct_preorder(const string* qianxu, int len)
{
treeptr root(nullptr);
if (qianxu == nullptr || len < 3 || qianxu[0] == "null")
return root;
stack<treeptr> s;
for (int i = len - 1; i >= 0; i--)
{
if (qianxu[i] == "null")
{
treeptr p(nullptr);
s.push(p);
}
else
{
treeptr l = s.top();
s.pop();
treeptr r = s.top();
s.pop();
treeptr p(new BinaryTree<string>(qianxu[i],l,r));
s.push(p);
}
}
return s.top();
}
//测试代码
string s[] = { "B", "C", "D", "null", "null", "E", "null", "null", "F", "null", "G", "H", "null", "null", "null" };
treeptr r = reconstruct_preorder(s, 15);
cout << r.get()->val << " " << r.get()->left->val << " " << r.get()->right->val<<endl;
若输入的数组是后序遍历,则把数组从左到右遍历,遇到null则入栈,遇到数据,则从栈里弹出两个数(第一个弹出的是右孩子),生成新的节点后压入栈,最后栈剩下的是根节点。若输入的数组是中序遍历,则无法唯一确定二叉数!
智能指针的用法:
头文件:#include <memory>
定义:std::tr1::shared_ptr<int> ptr(new int);
获取原始数据:(*ptr) = 87;//若是自定义类型如二叉树,也可以使用 ptr->left 的方式为其左子树赋值
*(ptr.get())=87;//用 ptr.get() 这种方式获取原始指针比较保险