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

后序遍历的非递归实现

作者: 小码弟 | 来源:发表于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;
    }
    

    相关文章

      网友评论

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

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