本文主要总结二叉树的前序、中序、后序遍历,分为递归和非递归
(1)前序遍历:根→左→右
(2)中序遍历:左→根→右
(3)后序遍历:左→右→根
首先定义一个二叉树:
- struct BiTree
- {
- char val;
- BiTree *lchild;
- BiTree *rchild;
- };
1.递归的方法
(1)前序遍历(根→左→右)
- void PreOrderTraverse(BiTree* root)
- {
- if (root!=NULL)
- {
- cout<<root->val;
- PreOrderTraverse(root->lchild);
- PreOrderTraverse(root->rchild);
- }
- }
(2)中序遍历(左→根→右)
- void InOrderTraverse(BiTree* root)
- {
- if (root!=NULL)
- {
- InOrderTraverse(root->lchild);
- cout<<root->val;
- InOrderTraverse(root->rchild);
- }
- }
(3)后序遍历(左→右→根)
- void PostOrderTraverse(BiTree* root)
- {
- if (root!=NULL)
- {
- PostOrderTraverse(root->lchild);
- PostOrderTraverse(root->rchild);
- cout<<root->val;
- }
- }
2.非递归遍历:用到了栈
(1)前序
- vector<int> preorderTraversal(TreeNode* root) {
- vector<int> res;
- std::stack<TreeNode*> temp;
- while (root || !temp.empty()) {
- while (root) {
- temp.push(root);
- res.push_back(root->val);
- root = root->left;
- }
- root = temp.top();
- temp.pop();
- root = root->right;
- }
- return res;
- }
(2)中序
- vector<int> inorderTraversal(TreeNode* root) {
- vector<int> res;
- std::stack<TreeNode*> temp;
- while (root || !temp.empty()) {
- while (root) {
- temp.push(root);
- root = root->left;
- }
- root = temp.top();
- temp.pop();
- res.push_back(root->val);
- root = root->right;
- }
- return res;
- }
(3)后序
- vector<int> postorderTraversal(TreeNode* root) {
- vector<int> res;
- std::stack<TreeNode*> temp;
- while (root || !temp.empty()) {
- while (root) {
- temp.push(root);
- res.insert(res.begin(),root->val);
- root = root->right;
- }
- root = temp.top();
- temp.pop();
- root = root->left;
- }
- return res;
- }