[力扣]144_二叉树的前序遍历

匿名 (未验证) 提交于 2019-12-02 23:47:01
/* 给定一个二叉树,返回它的 前序 遍历。  示例: 输入: [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%的用户 */ 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!