(1)根据一个二叉树的前序遍历和中序遍历还原二叉树。 (2)根据一个二叉树的后序遍历和中序遍历还原二叉树。
#include<iostream> #include<list> using namespace std; typedef list<int>::iterator index; class TreeNode { public: TreeNode(int value, TreeNode* left = NULL, TreeNode * right = NULL) :ivalue(value), ileft(left), iright(right) { } int getvalue() { return ivalue; } TreeNode* getleft() { return ileft; } TreeNode* getright() { return iright; } void setleft(TreeNode* left) { ileft = left; } void setright(TreeNode* right) { iright = right; } private: int ivalue; TreeNode* ileft; TreeNode* iright; }; void fronttraversal(list<int> &frontsequence,TreeNode* root) { if (root) { frontsequence.push_back(root->getvalue()); fronttraversal(frontsequence,root->getleft()); fronttraversal(frontsequence,root->getright()); } } void middletraversal(list<int> &frontsequence, TreeNode* root) { if (root) { middletraversal(frontsequence, root->getleft()); frontsequence.push_back(root->getvalue()); middletraversal(frontsequence, root->getright()); } } TreeNode* reconstruct(index frontstart, index frontend, index middlestart, index middleend) { TreeNode* root = new TreeNode(*frontstart); if (frontstart == frontend && *frontend == *frontstart) return root; index rootposition= middlestart; int leftlength = 0; index newfrontstart = frontstart; while (rootposition != middleend && *rootposition != root->getvalue()) { leftlength++; newfrontstart++; rootposition++; } if (*rootposition == root->getvalue()) { if (leftlength > 0) { root->setleft(reconstruct(++frontstart, add(frontstart,leftlength), middlestart, --rootposition)); rootposition++; } if (rootposition != middleend) { root->setright(reconstruct(++add(frontstart,leftlength), frontend, ++rootposition, middleend)); } } } int main() { TreeNode* node7 = constructatree(); list<int> frontsequence = list<int>(); fronttraversal(frontsequence, node7); list<int> middlesequence = list<int>(); middletraversal(middlesequence, node7); TreeNode* node1 = reconstruct(frontsequence.begin(), --frontsequence.end(), middlesequence.begin(), --middlesequence.end()); }
突然想到effective C++中提到过避免返回handles指向对象内部的成分,在上面的代码中尽管iright和ileft是私有成员,但是通过getleft和getright返回的reference却能够用来更改他们,所以这两个数据成员实际上是public,是时候加上const了。
const int getvalue() const const TreeNode* getleft() const const TreeNode* getright() const void fronttraversal(list<int> &frontsequence,const TreeNode* root) void middletraversal(list<int> &frontsequence, const TreeNode* root)