目录
- 二叉树的前序遍历
- 二叉树的中序遍历
- 二叉树的后序遍历
二叉树的前序遍历
二叉树遍历可以使用迭代和递归实现,代码如下:
递归法:
vector<int> ret;
void _preorderTraversal(TreeNode* root) {if (root == nullptr) return;ret.push_back(root->val);_preorderTraversal(root->left);_preorderTraversal(root->right);
}vector<int> preorderTraversal(TreeNode* root) {_preorderTraversal(root);return ret;
}
迭代法:
// 通过遍历+栈实现
vector<int> preorderTraversal2(TreeNode* root) {vector<int> ret;stack<TreeNode*> _stack;_stack.push(root);while (!_stack.empty()) {TreeNode* node = _stack.top();_stack.pop();if (node != nullptr) {ret.push_back(node->val);_stack.push(node->right);_stack.push(node->left);}}return ret;
}
二叉树的中序遍历
访问节点顺序是 左 -> 中 -> 右
递归法:
// 中序遍历
vector<int> ret2;
void _inorderTraversal(TreeNode* root) {if (root == nullptr) return;_inorderTraversal(root->left);ret2.push_back(root->val);_inorderTraversal(root->right);
}
迭代法:
二叉树的中序遍历使用迭代法和前序有很大的区别,思路上需要使用到栈+指针,指针记录当前访问的节点。
// 有点难度 没有理解到位
vector<int> inorderTraversal2(TreeNode* root) {vector<int> ret;stack<TreeNode*> _stack;
// _stack.push(root);TreeNode* curNode = root;while (curNode != nullptr || !_stack.empty()) {if (curNode != nullptr) {_stack.push(curNode);curNode = curNode->left;}else {curNode = _stack.top();_stack.pop();ret.push_back(curNode->val);curNode = curNode->right;}}return ret;
}
二叉树的后序遍历
节点访问顺序是:左 -> 右 -> 中
递归法是修改下中序遍历的递归法的语句顺序就好了。
迭代法的思路:
中 -> 左 -> 右 ----> 中 - > 右 -> 左 -----> 左 -> 右 -> 中
前序遍历 ----> 交换左右节点 再逆序 -----> 后序遍历
// 中左右 -》 中右左 -》 左右中
// 前序 -> 调整顺序 -> 反转 -> 后序
vector<int> postOrderTraversal(TreeNode* root) {vector<int> ret;stack<TreeNode*> _stack;_stack.push(root);while (!_stack.empty()) {TreeNode* node = _stack.top();_stack.pop();if (node != nullptr) {ret.push_back(node->val);_stack.push(node->left);_stack.push(node->right);}}reverse(ret.begin(), ret.end());return ret;
}