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; }
  • 相关阅读:
    Codeforces 1485C Floor and Mod (枚举)
    CodeForces 1195D Submarine in the Rybinsk Sea (算贡献)
    CodeForces 1195C Basketball Exercise (线性DP)
    2021年初寒假训练第24场 B. 庆功会(搜索)
    任务分配(dp)
    开发工具的异常现象
    Telink MESH SDK 如何使用PWM
    Telink BLE MESH PWM波的小结
    [LeetCode] 1586. Binary Search Tree Iterator II
    [LeetCode] 1288. Remove Covered Intervals
  • 原文地址:https://www.cnblogs.com/qiang-wei/p/9487261.html
Copyright © 2011-2022 走看看