Day14
vector<int>& vec什么情况下需要&,代表对原数组进行操作。
1.大数组的时候,因为不需要再创建一个vector<int>
2.允许对原数组修改
主要记录一下迭代法(其实也就是用栈来模拟递归运行)
前序遍历:
这时首先访问根节点,然后记录的也是根节点,所以可以一块处理,处理根节点,然后将左右放入栈,
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
TreeNode* cur;
if(root==NULL) return result;
st.push(root);
while(!st.empty()){
cur=st.top();
st.pop();
result.push_back(cur->val);
if(cur->right) st.push(cur->right);
if(cur->left) st.push(cur->left);
}
return result;
}
};
中序遍历
左中右,要先下到左边最后的节点,但其实可以考虑,每次记录的节点其实也都是根节点,当一个节点左孩子为空,就访问该节点,所以将根节点放入栈,然后将其指向左孩子。左孩子为空就访问栈,这时再指向右孩子,这时候处理方式又变成跟之前一样。
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
TreeNode* cur = root;
while(cur!=NULL || !st.empty()){
if(cur!=NULL){
st.push(cur);
cur=cur->left;
}
else{
cur = st.top();
st.pop();
result.push_back(cur->val);
cur=cur->right;
}
}
return result;
}
};
后序遍历
左右中,最后处理中,那么可以改成中右左,最后将顺序翻转,所以可以在前序的基础上修改
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root == NULL) return result;
st.push(root);
while(!st.empty()){
TreeNode* cur=st.top();
st.pop();
result.push_back(cur->val);
if(cur->left) st.push(cur->left);
if(cur->right) st.push(cur->right);
}
reverse(result.begin(),result.end());
return result;
}
};
统一的迭代法
之前不统一是因为处理顺序和遍历顺序不同,所以考虑将所有的节点都先放入,然后在根节点后面加个空指针(代表已经遍历过了),下次再搜到这个节点就是要输出的时候。
前序
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root==NULL) return result;
st.push(root);
while(!st.empty()){
TreeNode* node=st.top();
if(node!=NULL){
st.pop();
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
st.push(node);
st.push(NULL);
}
else{
st.pop();
node=st.top();
st.pop();
result.push_back(node->val);
}
}
return result;
}
};