/* 给定一个二叉树,返回它的 前序 遍历。 示例: 输入: [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%的用户 */
原文地址:https://www.cnblogs.com/alimy/p/11172088.html
时间: 2024-10-09 11:01:39