节点定义如下
1 // Definition for a binary tree node. 2 struct TreeNode { 3 int val; 4 TreeNode *left; 5 TreeNode *right; 6 TreeNode(int x) : val(x), left(NULL), right(NULL) {} 7 }
前序遍历:
若二叉树为空,则空操作返回,否则:
- 访问根节点
- 前序遍历根节点的左子树
- 前序遍历根节点的右子树
中序遍历:
若二叉树为空,则空操作返回,否则:
- 中序遍历根节点的左子树
- 访问根节点
- 中序遍历根节点的右子树
后序遍历:
若二叉树为空,则空操作返回,否则:
- 后序遍历根节点的左子树
- 后序遍历根节点的右子树
- 访问根节点
1. 递归方法
前序遍历:
1 void preorderTraversal(TreeNode* root, vector<int>& nums) { 2 if(!root) return; 3 nums.push_back(root->val); // 访问根节点 4 preorderTraversal(root->left); // 前序遍历左子树 5 preorderTraversal(root->right); // 前序遍历右子树 6 }
中序遍历:
void inorderTraversal(TreeNode* root, vector<int>& nums) { if(!root) return; inorderTraversal(root->left, nums); // 中序遍历左子树 nums.push_back(root->val); // 访问根节点 inorderTraversal(root->right, nums); // 中序遍历右子树 }
后序遍历:
1 void postorderTraversal(TreeNode* root, vector<int>& nums) { 2 if(!root) return; 3 postorderTraversal(root->left, nums); // 后序遍历左子树 4 postorderTraversal(root->right, nums); // 后序遍历右子树 5 nums.push_back(root->val); // 访问根节点 6 }
2.迭代方法(使用栈)
前序遍历:
void preorderTraversal(TreeNode* root, vector<int>& nums) { TreeNode* cur = root;
stack<TreeNode* > st; while (cur || !st.empty()) { if (!cur) { // 根节点为空,则需要返回上一级 cur = st.top(); // 访问右子树,而右子树已被保存在栈中 st.pop(); } nums.push_back(cur->val); // 访问根节点 if (cur->right) st.push(cur->right); // 保存待遍历节点 cur = cur->left; // 继续访问左子树 } }
中序遍历:
1 void inorderTraversal(TreeNode* root, vector<int>& nums) { 2 TreeNode* cur = root; 3 stack<TreeNode* > st; 4 5 while (cur || !st.empty()) { 6 if (cur) { // 找到最左节点并保存根节点 7 st.push(cur); // 即访问左子树 8 cur = cur->left; 9 } else { 10 cur = st.top(); 11 st.pop(); 12 nums.push_back(cur->val); // 访问根节点 13 cur = cur->right; // 访问右子树 14 } 15 } 16 }