标签:data- 算法实现 style 效率 tree 递归算法 etc order 使用
给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3] 1 2 / 3 输出: [1,2,3]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ /* 算法思想: 采用递归的思想,即借助系统栈,效率较低。二叉树的前序遍历规则:1. 访问根结点; 2. 遍历左子树; 3. 遍历右子树 */ /* class Solution { private: void rec(TreeNode* root,vector<int> &ret){ if(root != NULL){ ret.push_back(root->val); rec(root->left,ret); rec(root->right,ret); } } public: vector<int> preorderTraversal(TreeNode* root) { vector<int> ret; rec(root,ret); return ret; } };*/ /* 算法思想: 采用迭代的方法,使用了一个辅助结点p,这种写法其实可以看作是一个模版,对应的还有中序和后序的模版写法,形式很统一,方便于记忆。 辅助结点p初始化为根结点,while循环的条件是栈不为空或者辅助结点p不为空,在循环中首先判断如果辅助结点p存在,那么先将p加入栈中,然后将p的结点值加入结果res中,此时p指向其左子结点。否则如果p不存在的话,表明没有左子结点,我们取出栈顶结点,将p指向栈顶结点的右子结点。 */ //算法实现: class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> s; TreeNode *p = root; while (!s.empty() || p) { if (p) { s.push(p); res.push_back(p->val); p = p->left; } else { TreeNode *t = s.top(); s.pop(); p = t->right; } } return res; } };
标签:data- 算法实现 style 效率 tree 递归算法 etc order 使用
原文地址:https://www.cnblogs.com/parzulpan/p/10058982.html