如题
思路:先介绍先序遍历的非递归实现,首先根节点入栈,根节点出栈的时候再把它的右左孩子入栈,再把栈顶(也就是左孩子)出栈,把栈顶元素的右左孩子入栈,此过程一直执行,直到栈为空,出栈的顺序就是先序遍历。
先序遍历是在节点出栈时入栈右左孩子。对于后序遍历,不应该在父节点出栈时,才把右左孩子入栈,应该在入栈时就把右左孩子一并入栈。在父节点入栈时,应判断右左孩子是否入过栈,设一个标记负责记录。
typedef struct stackTreeNode
{
�BTree treenode;
int flag;
}* FTree;
int PostOrder(BTree root)
{
stack<FTree> stackTree;
FTree tree = (FTree) malloc(sizeof(struct stackTreeNode));
tree->treenode = root;
tree->flag = 0;
stackTree.push(tree);
while(!stacktree)
{
FTree temp_tree = stackTree.pop()
if(temp_tree.flag == 1)
{
cout<<temp_tree->treenode->data<<' ';
stackTree.pop();
}
else
{
if(temp_tree->treenode->rchild)
{
FTree sTree = (FTree)malloc(sizeof(struct stackTreeNode));
sTree->treenode = temp_tree->treenode->rchild;
sTree->flag = 0;
stackTree.push(sTree);
}
temp_tree->flag++;
if(temp_tree->treenode->lchild)
{
FTree sTree = (FTree) malloc(sizeof(struct stackTreeNode));
sTree->treenode = temp_tree->treenode->lchild;
sTree->flag = 0;
stackTree.push(sTree);
}
temp_tree->flag++;
}
}
return 1;
}
网友评论