zoukankan      html  css  js  c++  java
  • [力扣]144_二叉树的前序遍历

    /*
    给定一个二叉树,返回它的 前序 遍历。
     示例:
    输入: [1,null,2,3]  
       1
        
         2
        /
       3 
    输出: [1,2,3]
    进阶: 递归算法很简单,你可以通过迭代算法完成吗?
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
    */
    

    方法一:常规递归方式,用C语言实现(根左右)

    代码实现:

    /**
     * Note: The returned array must be malloced, assume caller calls free().
     */
     
    int     length  =   0       ;
    int*    ret_val =   NULL    ;
    
    void add_ele(int val)
    {
        length++;
        ret_val             = (int*)realloc(ret_val,sizeof(int)*length);    /*追加动态空间*/
        ret_val[length-1]   = val;
    }
    
    void __preOrder(struct TreeNode* node)
    {
        if(node==NULL)
        {
            return;
        }
        
        add_ele     ( node->val   );
        __preOrder  ( node->left  );
        __preOrder  ( node->right );
    }
    
    
    
    int* preorderTraversal(struct TreeNode* root, int* returnSize)
    {    
        if(root==NULL)
        {
            *returnSize = 0;
            return NULL;
        }
        
        ret_val    = malloc(sizeof(int)*1);
        length     = 1;
        ret_val[0] = root->val; /*根*/
        __preOrder(root->left); /*左*/
        __preOrder(root->right);/*右*/
        
        *returnSize = length;
        return ret_val;
    }
    

     提交结果:

    /*
    执行结果:通过
    显示详情
    执行用时 :4 ms, 在所有 C 提交中击败了89.42%的用户
    内存消耗 :7.8 MB, 在所有 C 提交中击败了56.03%的用户
    */
    

    方法2:迭代方法,需要栈辅助空间,改用C++

    代码实现:

    class Solution 
    {
        public:
            vector<int> preorderTraversal(TreeNode* root)
            {
                vector<int>                 pv                  ;
                stack<struct TreeNode*>     st                  ;
                TreeNode*                   working_ptr = NULL  ;
                
                if(root==NULL)
                {
                    return pv;
                }
                st.push(root);
                while(st.empty()==false)
                {
                    working_ptr = st.top();
                    st.pop();
                    pv.push_back(working_ptr->val);
                    if(working_ptr->right!=NULL)        /*根据栈的特性,根左右---那么应该是右孩子先入栈*/
                    {
                        st.push(working_ptr->right);
                    }
                    if(working_ptr->left!=NULL)
                    {
                        st.push(working_ptr->left);
                    }
                }
                return pv;
            }
    };
    
    /*
    执行结果:通过
    显示详情
    执行用时 :8 ms, 在所有 C++ 提交中击败了63.87%的用户
    内存消耗 :9 MB, 在所有 C++ 提交中击败了82.75%的用户
    */
    
    ~不再更新,都不让我写公式,博客园太拉胯了
  • 相关阅读:
    LeetCode(65) Valid Number
    LeetCode(57) Insert Interval
    Python 之scrapy框架58同城招聘爬取案例
    Python 之12306网站验证码校验案例
    Python 之selenium+phantomJS斗鱼抓取案例
    Python 之pytesseract模块读取知乎验证码案例
    Python 之糗事百科多线程爬虫案例
    Python 之beautifulSoup4解析库
    Python 之lxml解析库
    把一张的数据添加到另一张中
  • 原文地址:https://www.cnblogs.com/alimy/p/11172088.html
Copyright © 2011-2022 走看看