LeetCode:二叉樹的前序遍歷(遞迴與非遞迴法)
阿新 • • 發佈:2019-01-26
二叉樹結點類:
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x): val(x), left(NULL), right(NULL) {}
};
遞迴法:
class Solution{ public: void preOrder(TreeNode *root, vector<int> &vec) { if(root != NULL) { vec.push_back(root->val); postOrder(root->left, vec); postOrder(root->right, vec); } } vector<int> preorderTraversal(TreeNode *root) { vector<int> vec; preOrder(root, vec); return vec; }
非遞迴法:
藉助棧來實現後序遍歷(根左右):
1、首先將根結點壓進棧底,進入while()迴圈
2、在while()迴圈中取出棧頂元素,並將該元素的值插入到vector型別的變數res的尾部。
3、首先判斷該棧頂元素的右結點是否為空,不為空則將該右結點壓入棧中;再判斷該棧頂元素的左結點是否為空,不為空則將該左結點壓入棧中。在下一輪迴圈中(進入第2步)就會首先取出棧頂元素即右結點,並將右結點插入到res的尾部。
4、直到棧中無元素可取,停止迴圈。
class Solution { public: vector<int> preorderTraversal(TreeNode *root) { vector<int> res; if(root == NULL) return res; stack<TreeNode *> st; st.push(root); while(st.size()) { TreeNode *temp = st.top(); st.pop(); res.push_back(temp->val); if(temp->right) st.push(temp->right); if(temp->left) st.push(temp->left); } return res; } };