[力扣]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%的用户
*/

 

posted @ 2019-07-11 19:20  Alimy  阅读(474)  评论(0编辑  收藏  举报