二叉树的遍历
// Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};1、递归
// A.前序遍历(DLR, 根左右)
vector<int> res;
void DLR(TreeNode* root) {
if (root) {
res.emplace_back(root-> val);
DLR(root-> left);
DLR(root -> right);
}
}
// B.中序遍历(LDR, 左根右)
vector<int> res;
void LDR(TreeNode* root) {
if (root) {
LDR(root-> left);
res.emplace_back(root-> val);
LDR(root-> right);
}
}
// C.后序遍历(LRD, 左右根)
vector<int> res;
void LRD(TreeNode* root) {
if (root) {
LRD(root -> left);
LRD(root -> right);
res.emplace_back(root -> val);
}
}2、非递归
// X.层次遍历
vector<int> res;
void levelOrder(TreeNode* root) {
queue que;
que.push(root);
while (!que.empty()) {
TreeNode* node = que.front();
que.pop();
if (!node) {
continue;
}
res.emplace_back(node -> val);
que.push(node -> left);
que.push(node -> right);
}
}
// A.前序遍历
vector<int> res;
void preorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
stk.push(root);
while (!stk.empty()) {
TreeNode* node = stk.top();
stk.pop();
if (!node) {
continue;
}
res.emplace_back(node-> val);
stk.push(node-> right);
stk.push(node-> left);
}
}
// B.中序遍历
vector<int> res;
void inorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
TreeNode* cur = root;
while (cur || !stk.empty()) {
while (cur) {
stk.push(cur);
cur = cur -> left;
}
cur = stk.top();
stk.pop();
res.push_back(cur -> val);
cur = cur -> right;
}
}
// C.后序遍历
vector<int> res;
void postorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
stk.push(root);
while (!stk.empty()) {
TreeNode *node = stk.top();
stk.pop();
if (!node) {
continue;
}
res.push_back(node -> val);
stk.push(node -> left);
stk.push(node -> right);
}
reverse(res.begin(), res.end());
}3、Morris法
// A.前序遍历
vector<int> res;
void preorderTraversal(TreeNode* cur) {
TreeNode* pre;
while (cur) {
if (cur -> left) {
pre = cur -> left;
while (pre -> right && pre -> right != cur) {
pre = pre -> right;
}
if (pre -> right == nullptr) {
res.emplace_back(cur -> val);
pre -> right = cur;
cur = cur -> left;
} else {
pre -> right = nullptr;
cur = cur -> right;
}
} else {
res.emplace_back(cur -> val);
cur = cur -> right;
}
}
}
// B.中序遍历
vector<int> res;
void inorderTraversal(TreeNode* cur) {
TreeNode* pre;
while (cur) {
if (cur -> left) {
pre = cur -> left;
while (pre -> right && pre -> right != cur) {
pre = pre -> right;
}
if (pre -> right == nullptr) {
pre -> right = cur;
cur = cur -> left;
} else {
res.emplace_back(cur -> val);
pre -> right = nullptr;
cur = cur -> right;
}
} else {
res.emplace_back(cur -> val);
cur = cur -> right;
}
}
}
// C.后序遍历
vector<int> res;
void postorderTraversal(TreeNode* cur) {
TreeNode* pre;
while (cur) {
if (cur -> right) {
pre = cur -> right;
while (pre -> left && pre -> left != cur) {
pre = pre -> left;
}
if (pre -> left == nullptr) {
res.emplace_back(cur -> val);
pre -> left = cur;
cur = cur -> right;
} else {
pre -> left = nullptr;
cur = cur -> left;
}
} else {
res.emplace_back(cur -> val);
cur = cur -> left;
}
}
reverse(res.begin(), res.end());
}

