由二叉树的前序和中序如何得到二叉树的后序呢?
首先得明白什么是前序、中序、后序。
二叉树前序:遍历顺序为,根节点、左子树、右子树;中序:遍历顺序为,左子树、根节点、右子树;后序:遍历顺序为,左子树、右子树、根节点
可以发现,二叉树前序中的第一个节点为树的根节点root,然后找出root在中序里面的位置,就可以把前序和中序分别划分为左、右子树两个部分,然后递归调用即可。
#include<iostream> using namespace std; template<class T> struct BinaryTreeNode { T _data; BinaryTreeNode* _left; BinaryTreeNode* _right; BinaryTreeNode(const T& x) :_data(x) , _left(NULL) , _right(NULL) {} }; template<class T> class BinaryTree { protected: BinaryTreeNode<T>* _root; protected: void _PreOrder(BinaryTreeNode<T>* root) { if (root != NULL) { cout << root->_data << " "; _PreOrder(root->_left); _PreOrder(root->_right); } return; } BinaryTreeNode<T>* _CreateBinary(char* preOrder, char* inOrder, int length) { BinaryTreeNode<T>* root = NULL; if (length == 0) return NULL; int tmp = *preOrder; int index = 0; while (index < length&&inOrder[index] != tmp) index++; if (index < length) { root = new BinaryTreeNode<T>(tmp-'0'); root->_left = _CreateBinary(preOrder + 1, inOrder,index); root->_right = _CreateBinary(preOrder + index + 1, inOrder + index + 1, length - index - 1); } return root; } void _Clear(BinaryTreeNode<T>* root) { if (root) { _Clear(root->_left); _Clear(root->_right); delete root; } } public: BinaryTree() :_root(NULL) {} ~BinaryTree() { _Clear(_root); _root = NULL; } void PreOrder() { _PreOrder(_root); cout << endl; } void CreateBinaryTree(char* preOrder, char* inOrder) { int length = strlen(preOrder); _root = _CreateBinary(preOrder, inOrder,length); } }; void Test1() { char* preOrder = "12473568"; char* inOrder = "47215386"; BinaryTree<int> bt; bt.CreateBinaryTree(preOrder, inOrder); bt.PreOrder(); }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。