給定一個二叉樹,返回它的 前序 遍歷。
示例:
輸入: [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) {} * }; */ class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int> vec; if(root != NULL){ stack<TreeNode*> stk; TreeNode *node = root; stk.push(node); while(!stk.empty()){ node = stk.top(); stk.pop(); if(node->right != NULL) stk.push(node->right); if(node->left != NULL) stk.push(node->left); vec.emplace_back(node->val); } } return vec; } };
遞歸法:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int> vec; if(root != NULL){ DLR(root, vec); } return vec; } void DLR(TreeNode* root, vector<int>& vec){ // vector<int> vec = *vecPtr; vec.push_back(root->val); if(root->left != NULL){ DLR(root->left, vec); } if(root->right != NULL){ DLR(root->right, vec); } return; } };
迭代法思路:
因為是前序遍歷,所以輸出的時候應該是中-左-右,所以壓棧的時候要先壓右,再壓左。