二叉树的递归遍历
递归遍历相对简单,直接给出代码实现
前序遍历
void traversal(TreeNode* root,vector<int>& vec) {
if (root == nullptr)
return;
vec.push_back(root->val);
traversal(root->left,vec);
traversal(root->right,vec);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
中序遍历
void traversal(TreeNode* root,vector<int>& vec) {
if (root == nullptr)
return;
traversal(root->left,vec);
vec.push_back(root->val);
traversal(root->right,vec);
}
后序遍历
void traversal(TreeNode* root,vector<int>& vec) {
if (root == nullptr)
return;
vec.push_back(root->val);
traversal(root->right,vec);
traversal(root->left,vec);
}
二叉树的迭代遍历
迭代法就是利用栈来实现二叉树的遍历
前序遍历
先处理根节点,再处理左子树,再处理右子树
代码实现思路是,先让根节点入栈,然后处理根节点,根节点出栈,然后让右子树入栈,再让左子树入栈,再出栈处理,循环这个过程。整个过程是一边处理,一边访问的。
代码实现
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if (root == nullptr)
return result;
st.push(root);//根节点入栈
TreeNode* node = nullptr;
while (!st.empty()) {
node = st.top();
result.push_back(node->val);//处理
st.pop();
if (node->right) st.push(node->right);//右子树入栈,先入栈才能后出栈
if (node->left) st.push(node->left);//左子树入栈
}
return result;
}
后序遍历
前序遍历的顺序是 根左右 ,后续遍历的顺序是 左右根 。我们只需要改变入栈顺序,先让前序遍历变成 根右左,再反转一下,就得到了 左右根。
代码实现
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
TreeNode* node = nullptr;
if (root == nullptr)
return result;
st.push(root);
while (!st.empty()) {
node = st.top();
result.push_back(node->val);
st.pop();
if (node->left) st.push(node->left);//先变成根右左
if (node->right) st.push(node->right);
}
reverse(result.begin(), result.end());
return result;
}
中序遍历
中序遍历的顺序是 左根右,与前序遍历不同的是,它不能一边处理一边访问,因为它要先访问到整个二叉树最左下角的节点,才能开始处理。
代码实现
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
TreeNode* node = root;
while (node || !st.empty()) {
if (node) {//这个if的作用,找到最左下的节点,处理左子树
st.push(node);//不断找左子树,直到左子树为空,此时访问这个左子树为空的二叉树的根节点
node = node->left;
}
else {
node = st.top();
result.push_back(node->val);//处理根节点
st.pop();
node = node->right;//访问右子树
}
}
return result;
}