zoukankan      html  css  js  c++  java
  • ACM-后序遍历(简单方法和正规方法)

    1.后序遍历简单方法

    /*
    *二叉树遍历一般有三种方法:前序,中序,后序。
    *其中前序遍历u顺序为:根->左子树->右子树,在此定义一种新的遍历方法:根->右子树->左子u树
    *使用我们新定义的方法遍历二叉树之后,再用reverse()函数反转一下,便得到后序遍历序列!
    *以下是具体实现代码:
    */
    vector<int> postorderTraversal(TreeNode *root) { vector<int> postorderTraversal; //后续遍历 if(root == nullptr) return postorderTraversal; stack<TreeNode *> tempStack; tempStack.push(root); while(tempStack.size() != 0){ TreeNode *p = tempStack.top(); tempStack.pop(); postorderTraversal.push_back(p->val); if(p->left != nullptr) tempStack.push(p->left); if(p->right != nullptr) tempStack.push(p->right); } reverse(postorderTraversal.begin(),postorderTraversal.end()); return postorderTraversal; }

    2.后序遍历正规方法

    /*
    *非递归进行后序遍历
    *利用栈的特性进行后序遍历,每个节点有三种情况:
    * 1.此节点左右子树不是都为空,那么将此节点的右节点、左节点分别按照顺序入栈,先右后左的顺序保证了出栈时是先遍历左子树,再遍历右子树的
    * 2.此节点左右子树都为空,则遍历此节点,并将此节点从栈中删除
    * 3.上一次遍历的节点是此节点的左或右节点,那么此次应该遍历的节点就是此节点
    */
    vector<int> postorderTraversal(TreeNode *root) { vector<int>res; //后序遍历的序列 stack<TreeNode *>tempStack; if(root == nullptr) return res; tempStack.push(root); TreeNode *preNode = nullptr; while(tempStack.size() != 0){ TreeNode *current = tempStack.top(); //取出栈顶元素,不删除 if((current->left == nullptr && current->right == nullptr) || (preNode != nullptr && (preNode == current->left || preNode == current->right))) { res.push_back(current->val); tempStack.pop(); preNode = current; } else{ if(current->right != nullptr) tempStack.push(current->right); if(current->left != nullptr) tempStack.push(current->left); } } return res; }
  • 相关阅读:
    正则表达式30分钟入门教程
    Literal控件用法
    用asp.net 2.0实现网站二级域名
    IIS7 asp.net URL重写配置
    用VS2008开发Ajax网站需要注意
    C#中的equals与==的比较,赋加compareto
    nvchar(50)与Substring(0,50)的理解
    利用Mircosoft URLRewriter.dll实现asp.net页面伪静态
    .NET命名规范中文版
    iframe动态改变src的测试
  • 原文地址:https://www.cnblogs.com/qiang-wei/p/9487261.html
Copyright © 2011-2022 走看看