1.前序遍历
前序遍历:先遍历根节点,再遍历左子树,最后遍历右子树(根-左-右)
1.1 基于递归实现
class Solution { public: vector<int> res; vector<int> preorderTraversal(TreeNode* root) { if (root == nullptr) return res; res.push_back(root->val); preorderTraversal(root->left); preorderTraversal(root->right); return res; } };
1.2 基于迭代实现
由于没有指向父节点的指针,所以需要辅助栈来记录路径中的右子节点。
class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> stack; //辅助栈 stack.push(root); while (!stack.empty()) { TreeNode* pNode = stack.top(); stack.pop(); if (pNode == nullptr) continue; res.push_back(pNode->val); //先访问当前节点 stack.push(pNode->right); //先存入右子节点 stack.push(pNode->left); //后存入左子节点 } return res; } };
class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> stack; //辅助栈 while (true) { if (root != nullptr) //寻找最左节点 { res.push_back(root->val); //访问中途节点 stack.push(root->right); //暂存右子节点 root = root->left; } else if (!stack.empty()) //找到最左节点后 { root = stack.top(); stack.pop(); } else break; } return res; } };
2.中序遍历
中序遍历:先遍历左子树,再遍历根节点,最后遍历右子树(左-根-右)
2.1 基于递归实现
2.2 基于迭代实现
3. 后序遍历
后序遍历:先遍历左子树,再遍历右子树,最后遍历根节点(左-右-根)
3.1 基于递归实现
3.2 基于迭代实现
4. 层次遍历
代码与图参考:
[1] LeetCode 题库.
[2] 数据结构(C++语言版), 邓俊辉, 2010.