• Binary Tree Preorder Traversal


    题目:

    Given a binary tree, return the preorder traversal of its nodes' values.

    For example:
    Given binary tree {1,#,2,3},

       1
        
         2
        /
       3
    

    return [1,2,3].

    Note: Recursive solution is trivial, could you do it iteratively?

    解析:

    如果采用递归方式来做,思路是很简单的。关键是返回值result的处理:因为不能在preorderTraversal中定义vector<int>,所以定义了临时函数,把result作为一个入口参数传入其中并进行操作。

     1 // recursive, but it's trivial...
     2 vector<int> preorderTraversal(TreeNode* root) {
     3     vector<int> v;
     4     preTraversal(root, v);
     5     return v;
     6 }
     7 void preTraversal(TreeNode* root, vector<int>& v){
     8     if(!root) return;
     9     v.push_back(root->val);
    10     preTraversal(root->left, v);
    11     preTraversal(root->right, v);
    12 }

    迭代,用栈

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

    其他方法

     1 vector<int> preorderTraversal(TreeNode* root) {
     2     vector<int> v;
     3     if(!root) return v;
     4     TreeNode* temp = root;
     5     stack<TreeNode*> s;
     6     while(true){
     7         while(temp){
     8             v.push_back(temp->val);
     9             if(temp->right) s.push(temp->right);
    10             temp = temp->left;
    11         }
    12         if(s.empty()) break;
    13         temp = s.top();
    14         s.pop();
    15     };
    16 }
    17 
    18 // morris traversal, O(1) space
    19 vector<int> preorderTraversal(TreeNode* root) {
    20     vector<int> v;
    21     if(!root) return v;
    22     TreeNode* temp = root, *prev;
    23     while(temp){
    24         if(!temp->left){
    25             v.push_back(temp->val);
    26             temp = temp->right;
    27         }else{
    28             prev = temp->left;
    29             while(prev->right&&(prev->right != temp))
    30                 prev = prev->right;
    31             if(!prev->right){
    32                 v.push_back(temp->val);
    33                 prev->right = temp;
    34                 temp = temp->left;
    35             }else{
    36                 prev->right = NULL;
    37                 temp = temp->right;
    38             }
    39         }
    40     }
    41 }
  • 相关阅读:
    jsp>EL表达式语言 小强斋
    jsp>JSP + Servlet + JavaBean开发模式 小强斋
    jsp>Smartupload例子代码 小强斋
    jsp>servlet 小强斋
    jsp>JSP + Servlet + JavaBean开发模式 小强斋
    五言诗
    夜深灯下行
    2011 年数据库大会的PPT下载
    去除iPhone icon的光晕效果
    望苍天
  • 原文地址:https://www.cnblogs.com/raichen/p/4941712.html
Copyright © 2020-2023  润新知