智能指针的用法以及根据前序遍历生成树

来源:互联网 发布:java实现runnable接口 编辑:程序博客网 时间:2024/06/05 20:14

题目: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() 这种方式获取原始指针比较保险



0 0