方法一:遞歸算法
vector<int> res; vector<int> preorderTraversal(TreeNode* root) { if (!root) return res; res.push_back(root->val); if (root->left) preorderTraversal(root->left); if (root->right) preorderTraversal(root->right); return res; }
方法二:非遞歸spa
vector<int> preorderTraversal(TreeNode* root) { vector<int> res; if (!root) return res; stack<TreeNode*> S; TreeNode* p = root; while(p||!S.empty()) { if (p) // 訪問左子樹 { res.push_back(p->val); S.push(p); p=p->left; } else // 訪問右子樹 { p=S.top(); S.pop(); p=p->right; } } return res; }
方法三:非遞歸(該方法可用於後序遍歷,須要修改幾處代碼)code
vector<int> res; vector<int> preorderTraversal(TreeNode* root) { if (!root) return res; stack<TreeNode*> S; S.push(root); while (!S.empty()) { root=S.top(); S.pop(); if (root->right) S.push(root->right); // 要實現後序遍歷,須要如下兩行調換 if (root->left) S.push(root->left); res.push_back(root->val); // res.insert(0,root->val)即爲後序遍歷 } return res; }
結論:htm