• [LeetCode] Binary Tree Preorder Traversal


    This is a fundamental and yet classic problem. I share my three solutions here:

    1. Iterative solution using stack --- O(n) time and O(n) space;
    2. Recursive solution --- O(n) time and O(n) space (considering the spaces of call stack);
    3. Morris traversal --- O(n) time and O(1) space!!!

    Iterative solution using stack:

     1     vector<int> preorderTraversal(TreeNode* root) {
     2          vector<int> nodes;
     3          stack<TreeNode*> toVisit;
     4          TreeNode* curNode = root;
     5          while (curNode || !toVisit.empty()) {
     6              if (curNode) {
     7                  nodes.push_back(curNode -> val);
     8                  if (curNode -> right) toVisit.push(curNode -> right);
     9                  curNode = curNode -> left;
    10              }
    11              else {
    12                  curNode = toVisit.top();
    13                  toVisit.pop();
    14              }
    15          }
    16          return nodes;
    17     }

    Recursive soltuion:

     1 void preorder(TreeNode* root, vector<int>& nodes) {
     2     if (!root) return;
     3     nodes.push_back(root -> val);
     4     preorder(root -> left, nodes);
     5     preorder(root -> right, nodes);
     6 } 
     7 vector<int> preorderTraversal(TreeNode* root) {
     8     vector<int> nodes;
     9     preorder(root, nodes);
    10     return nodes;
    11 } 

    Morris traversal:

     1 vector<int> preorderTraversal(TreeNode* root) {
     2     TreeNode* curNode = root;
     3     vector<int> nodes;
     4     while (curNode) {
     5         if (curNode -> left) {
     6             TreeNode* predecessor = curNode -> left;
     7             while (predecessor -> right && predecessor -> right != curNode)
     8                 predecessor = predecessor -> right;
     9             if (!(predecessor -> right)) {
    10                 nodes.push_back(curNode -> val);
    11                 predecessor -> right = curNode;
    12                 curNode = curNode -> left;
    13             }
    14             else {
    15                 predecessor -> right = NULL;
    16                 curNode = curNode -> right;
    17             }
    18         }
    19         else {
    20             nodes.push_back(curNode -> val);
    21             curNode = curNode -> right;
    22         }
    23     }
    24     return nodes;
    25 }
  • 相关阅读:
    MongoDB 学习笔记之 MongoDB导入导出
    快学Scala 第十四课 (读取行,读取字符, 控制台读取)
    MongoDB 学习笔记之 权限管理基础
    MongoDB 学习笔记之 索引
    MongoDB 学习笔记之 游标
    MongoDB 学习笔记之 查询表达式
    MongoDB 学习笔记之 基本CRUD
    MongoDB 学习笔记之 入门安装和配置
    Eclipse设置JVM的内存参数
    cron表达式详解
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4548010.html
Copyright © 2020-2023  润新知