Leetcode 589.N叉树的前序遍历
递归解法
class Solution {
public:
void travel(Node* cur,vector<int> & res)
{
if(cur==nullptr)
{
return ;
}
res.push_back(cur->val);
for(int i=0;i<(cur->children).size();i++)
{
travel(cur->children[i],res);
}
}
vector<int> preorder(Node* root)
{
vector<int> res;
travel(root,res);
return res;
}
};
迭代解法
深度优先遍历,最需要注意的地方是:
for()
循环中,是倒序的。
class Solution {
public:
vector<int> preorder(Node* root)
{
vector<int> res;
stack<Node*> st;
if(root==nullptr)
{
return res;
}
st.push(root);
while(!st.empty())
{
Node* node=st.top();
if(node!=nullptr)
{
st.pop();
for(int i=(node->children).size()-1;i>=0;i--)
{
if(node->children[i])
{
st.push(node->children[i]);
}
}
st.push(node);
st.push(nullptr);
}
else
{
st.pop();
node=st.top();
st.pop();
res.push_back(node->val);
}
}
return res;
}
};
Leetcode 590.N叉树的后序遍历
递归解法
class Solution {
public:
void travel(Node* cur,vector<int> & res)
{
if(cur==nullptr)
{
return ;
}
for(int i=0;i<(cur->children).size();i++)
{
travel(cur->children[i],res);
}
res.push_back(cur->val);
}
vector<int> postorder(Node* root)
{
vector<int> res;
travel(root,res);
return res;
}
};
迭代解法
class Solution {
public:
vector<int> postorder(Node* root)
{
stack<Node*> st;
vector<int> res;
if(root==nullptr)
{
return res;
}
st.push(root);
while(!st.empty())
{
Node* node=st.top();
if(node!=nullptr)
{
st.pop();
st.push(node);
st.push(nullptr);
for(int i=(node->children).size()-1;i>=0;i--)
{
if(node->children[i])
{
st.push(node->children[i]);
}
}
}
else
{
st.pop();
node=st.top();
st.pop();
res.push_back(node->val);
}
}
return res;
}
};
总结
这两道N叉树的题,让我不仅仅局限于二叉树,眼界放的更开了。并且又复习了一遍深度优先遍历(包括前序遍历和后序遍历)和递归解法的设计。
个人认为非常有价值。