题意:
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
方法一:
递归
思路:核心:先序递归要按照“根节点->左儿子->右儿子”的顺序遍历树。
class Solution { public: vector<int> res; vector<int> preorderTraversal(TreeNode* root) { pre(root);//先序遍历 return res; } void pre(TreeNode *root){//递归先序遍历 if(root==nullptr) return; res.push_back(root->val); pre(root->left); pre(root->right); } };
时间复杂度:空间复杂度:
方法二:
栈实现非递归
思路:栈实现先序遍历。
初始化一个存储树节点的栈空间,遍历指针 p=root。
外层循环的条件是遍历指针 p 非空或栈非空,
内层循环则是从根节点开始,循环的遍历左儿子入栈;
当左儿子为空时,则弹栈并指向弹出元素的右儿子。
其中,入栈序列则是树的先序遍历序列。
class Solution { public: vector<int> res; vector<int> preorderTraversal(TreeNode* root) { stack<TreeNode*> st;//栈 TreeNode* p=root; while(p||!st.empty()){//循环 while(p){//遍历左儿子入栈 st.push(p); res.push_back(p->val); p=p->left; } p=st.top();//弹栈 st.pop(); p=p->right;//遍历右儿子 } return res; } };
时间复杂度:空间复杂度: