目录
1.前序遍历
二叉树的前序遍历是“根右左”,即是在访问完根节点之后遍历左子树再遍历右子树
如图:前序遍历结果为 ABDECFG
代码如下:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
//先序遍历 根左右
vector<int> res; //初始化列表res
if (!root) return res;
stack<TreeNode*> s;
s.push(root); //根节点入栈
while (!s.empty()) //栈不为空
{
//栈顶出栈
TreeNode* node = s.top();
s.pop();
//栈顶添加到输出链表
res.emplace_back(node->val);
//右子树不为空,右子树节点入栈
if (node->right) s.push(node->right);
//左子树不为空,左子树节点入栈
if (node->left) s.push(node->left);
}
return res;
}
}
2.中序遍历
中序遍历是"左根右",即是先遍历左子树,然后访问根节点最后遍历右子树
仍以此图为例,遍历结果为 DBEAFCG
代码如下:
vector<int> inorderTraversal2(TreeNode* root) {
vector<int> res; //初始化列表
if (!root) return res;
stack<TreeNode*> s;
TreeNode* cur = root; //当前节点
while (!s.empty() || cur)
{
//沿着当前节点的左分支一直走,直到为空。在这个过程中将遍历的节点都入栈
while (cur)
{
s.push(cur);
cur = cur->left;
}
//栈顶元素出栈,同时将栈顶元素添加到输出列表
TreeNode* node = s.top();
s.pop();
res.emplace_back(node->val);
//更新当前节点cur为栈顶元素的右子树节点。
cur = node->right;
}
return res;
}
3.后序遍历
后序遍历是"左右根",即先遍历左子树,然后遍历右子树最后遍历根节点
上图为例:遍历结果为 DEBFGCA
代码如下:
两种思路:
1.根据前序遍历(根左右)思路遍历'根右左',然后对输出列表反序,得到左右根
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res; //初始化列表
if (!root) return res;
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) //栈不为空
{
TreeNode* node = s.top();
s.pop();
res.emplace_back(node->val); //添加到输出列表
if (node->left) s.push(node->left);
if (node->right)s.push(node->right);
}
reverse(res.begin(), res.end()); //对列表res反序
return res;
}
};
2.根据中序遍历(左根右)思路遍历右分支节点入栈并添加到输出列表,更新当前节点为左分支, 反序
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
if (!root) return res;
stack<TreeNode*> s;
TreeNode* cur = root; //当前节点
while (!s.empty() || cur)
{
//遍历当前节点右分支,直到为空,将遍历节点入栈同时添加到输出列表
while (nullptr != cur)
{
res.emplace_back(cur->val);
s.push(cur);
cur = cur->right;
}
TreeNode* node = s.top();
s.pop();
cur = node->left; //更新当前节点为左子树节点
}
reverse(res.begin(), res.end());
return res;
}
};