题目详见:https://leetcode.cn/problems/n-ary-tree-postorder-traversal/description
后序:左右根
中序:左根右
前序:根左右
遍历顺序问题敬请翻阅其余资料
关于数据输入问题
以原题中示例二作为一个例子。首先是第一个节点。我们可以看到它给了一个1,然后后面的话是一个空指针。这说明1这一层就结束了。然后后面紧跟着2345。然后是空指针就表明2345是1的孩子。然后注意这里有连着的两个空指针,此时第二个空指针实际上是第二个节点2的孩子,也就表明第二个节点没有孩子。然后我们以此类推。然后是67,表明他们是3的孩子,然后是一个空指针,就表明3的孩子结束,然后到了8,8是4的孩子,然后又一个空指针表明4的孩子结束。然后是9 10,然后又一个空指针,表明5的孩子结束。然后这里有两个空指针,第二个空指针就表明6没有孩子,也就是6的孩子是空指针,以此类推。
注释代码
/*
// Definition for a Node.
class Node {
public:
int val; //节点的值
vector<Node*> children; //结点的孩子集合,从左到右依次排开,注意孩子的个数不限制
Node() {}
Node(int _val) {
val = _val;
}
// init func
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public:
void helper(const Node* root, vector<int>& res){注意这里res传的是引用,详见下方注释
if(root == nullptr){ //如果当前节点为空,则返回
return;
}
//这里从左到右遍历所有孩子,因为是后序遍历,所以优先处理所有孩子,从左到右。(左右)
for(auto& ch: root->children){
helper(ch, res);
}
//处理根(根)
res.emplace_back(root->val);
}
vector<int> postorder(Node* root) {
vector<int> res;
helper(root, res); //传的是引用。
return res;
}
};