您的位置:首页 > 其它

非递归实现二叉查找树的后序遍历

2013-09-20 11:25 127 查看
算法描述:

步骤一:

从当前节点开始,对当前节点以及它的左子树的所有左节点进行入栈处理,但在入栈过程中不做访问,直到当前节点的最左边的叶子节点为止。

步骤二:

当步骤一入栈完毕后,开始出栈,在出栈前先判断栈顶元素是否有右子树,如果没有右子树,直接出栈并访问该节点,并用一个指针记录下当前访问的节点地址信息,直到栈顶元素有右子树为止。

步骤三:

当栈顶元素有右子树,需要判断上一次访问的位置是否是栈顶元素的右节点,如果是,则继续进行出栈处理,并记录下当前访问的节点地址信息,直到栈顶元素有右子树且上一次访问的节点不是栈顶元素的右节点为止。

步骤四:当栈顶元素有右子树且上一次访问的节点不是栈顶元素的右节点,则对栈顶元素的右节点从步骤一开始重新执行,直到栈空。


struct bstree_record;
typedef struct bstree_record* bstree;
struct bstree_record
{
  int data;
  bstree m_pleft;
  bstree m_pright;
};

void  post_visit(bstree t)
{
  if(t)
  {
        bstree prev = NULL;
        bstree cur = t;
        stack s = NULL;
        while(cur)
        {
            while(cur)
           {
              PushStack(cur,s);
              cur = cur->m_pleft;
           }
  
           cur = TopStack(s);
           while(cur && (cur->m_pright == NULL || cur->m_pright == pre)
           {
               printf(“the data is %d”,cur->data);
               prev = cur;
               PopStack(s);
               cur = TopStack(s);
           }
`	}
  }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐