美文网首页
后序遍历的非递归实现

后序遍历的非递归实现

作者: 小码弟 | 来源:发表于2018-10-09 15:28 被阅读0次

如题

思路:先介绍先序遍历的非递归实现,首先根节点入栈,根节点出栈的时候再把它的右左孩子入栈,再把栈顶(也就是左孩子)出栈,把栈顶元素的右左孩子入栈,此过程一直执行,直到栈为空,出栈的顺序就是先序遍历。
先序遍历是在节点出栈时入栈右左孩子。对于后序遍历,不应该在父节点出栈时,才把右左孩子入栈,应该在入栈时就把右左孩子一并入栈。在父节点入栈时,应判断右左孩子是否入过栈,设一个标记负责记录。

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;
}

相关文章

  • 数据结构-树的遍历

    1. 先序遍历 递归实现 非递归实现 2. 中序遍历 递归实现 非递归实现 3. 后序遍历 递归实现 非递归实现 ...

  • 二叉树前、中、后序遍历、层次遍历

    1、前序遍历 非递归:利用Stack实现 递归 2、中序遍历 非递归:利用Stack实现 递归: 3、后序遍历 非...

  • 二叉树遍历

    先序遍历——[递归、非递归] 中序遍历——[递归、非递归] 后序遍历——[递归、非递归] 层次遍历——[递归、非递归]

  • 二叉树的遍历

    非递归前序遍历 非递归中序遍历 非递归后序遍历 层序遍历

  • 树的遍历,golang实现

    先序,递归 中序,递归 后序,递归 先序,非递归 中序,非递归 后序,非递归 层序遍历

  • 二叉树的前中后三种遍历(递归、非递归和Morris)

    前序遍历 递归版本 非递归版本 中序遍历 递归版本 非递归版本 Morris 遍历待补充 后序遍历 递归版本 非递...

  • 二叉树的遍历算法

    递归版本 先序遍历: 中序遍历: 后序遍历: 非递归版本 先序遍历: 中序遍历: 后序遍历: 层次遍历:

  • 树的遍历

    节点结构: 先序遍历 递归 非递归 后序遍历 递归 非递归 中序遍历 递归 非递归 层序遍历 类库 有了上述遍历算...

  • 左神算法笔记——Morris遍历

    基本问题——实现二叉树的前序、中序、后序遍历 (递归、非递归,mirros方法) 递归 递归方式下的前中后遍历 非...

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

网友评论

      本文标题:后序遍历的非递归实现

      本文链接:https://www.haomeiwen.com/subject/zemeaftx.html