LeetCode144 二叉树的前序遍历
Posted 咖喱橙的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode144 二叉树的前序遍历相关的知识,希望对你有一定的参考价值。
给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [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; } };
以上是关于LeetCode144 二叉树的前序遍历的主要内容,如果未能解决你的问题,请参考以下文章
⭐算法入门⭐《二叉树》简单09 —— LeetCode 144. 二叉树的前序遍历