二叉树的递归遍历
递归三部曲
题解
class Solution {
public:
void traversal(TreeNode *cur,vector<int> &nums)
{
if(cur == NULL)
return;
nums.push_back(cur->val);
// traversal(cur,nums);
traversal(cur->left,nums);
traversal(cur->right,nums);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> nums;
traversal(root,nums);
return nums;
}
};
二叉树的非递归遍历
前序遍历
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
if(root == NULL)
return res;
st.push(root);
while(!st.empty())
{
TreeNode* node = st.top(); // 中
st.pop();
res.push_back(node->val);
if (node->right) st.push(node->right); // 右(空节点不入栈)
if (node->left) st.push(node->left);
}
return res;
}
};
中序遍历
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
TreeNode* cur = root;
stack<TreeNode*> st;
while(!st.empty() || cur != NULL)
{
if(cur != NULL)
{
st.push(cur);
cur = cur->left;
}
else
{
cur = st.top();
st.pop();
res.push_back(cur->val);
cur = cur->right;
}
}
return res;
}
};
后序遍历
注意
1.stack的类型需要是二叉树,而不可以是二叉树的值
若stack类型为二叉树的值,即stack,则,在while循环中无法遍历二叉树;若stack类型为二叉树,即stack<TreeNode*>,则,在while循环中可以通过将栈顶赋给一个二叉树节点指针来对二叉树进行遍历。
递归通过传入参数为二叉树节点来对二叉树进行遍历
非递归通过栈顶赋值来对二叉树进行遍历
2.由于二叉树内含指针,因此需要对指针是否为空先进行判断。
二叉树的统一迭代法
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
if(root == NULL)
return res;
st.push(root);
while(!st.empty())
{
TreeNode *cur = st.top();
if(cur != NULL)
{
st.pop();
st.push(cur);
st.push(NULL);
if(cur->right) st.push(cur->right);
if(cur->left) st.push(cur->left);
}
else
{
st.pop();
TreeNode *node = st.top();
res.push_back(node->val);
st.pop();
}
}
return res;
}
};
注意
由于左右节点都是下一层的中间节点,因此NULL需要放在中间节点的后面,来标志未处理节点