二叉树如下所示:
二叉树的前序序列化表示如下:
1 2 4 7 -1 -1 -1 5 -1 8 -1 -1 3 6 -1 -1 -1
-1代表左右子树为NULL的情况,使用前序序列构造二叉树。
二叉树的结构体定义如下:
struct TreeNode{
TreeNode(int value):left(NULL),right(NULL),val(value){ }
TreeNode *left;
TreeNode *right;
int val;
};
使用栈结构,对每个结点加一个标志(true、false),false代表当前结点的左孩子已被访问,但由于是后序遍历,此时结点不出栈,只是将结点标志置为true,true代表当前结点的右孩子已经访问,可以将结点弹出栈了。但必须同时压入一个空节点,这是避免重复访问父节点的左孩子,造成死循环。
void Postordertraverse(TreeNode *root){
typedef std::pair<TreeNode*,int> PTI;
if(root == NULL) return;
stack<PTI> s;
s.push(PTI(root, false));
PTI *curnode = NULL;
while(!s.empty()){
while(curnode = &s.top(), curnode->first) s.push(PTI(curnode->first->left, false));
s.pop();
if(!s.empty()){
curnode = &s.top();
if(curnode->second == false) {
curnode->second = true;
s.push(PTI(curnode->first->right, false));
}else{
s.pop();
std::cout << curnode->first->val << " ";
s.push(PTI(NULL, false));
}
}
}
}
(二)后序递归遍历
void Postordertraverse_Recur(TreeNode *root){
if(root == NULL) return;
Postordertraverse_Recur(root->left);
Postordertraverse_Recur(root->right);
std::cout << root->val << " ";
}
主调接口
int main(void)
{
TreeNode *root = NULL;
//先序构造树
PreoderBuildTree(root);
//后续非递归遍历
Postordertraverse(root);
std::cout << std::endl;
//后续递归遍历
Postordertraverse_Recur(root);
std::cout << std::endl;
}