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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值