多叉树的遍历

429. N叉树的层序遍历

给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
img
返回其层序遍历:

[
     [1],
     [3,2,4],
     [5,6]
]

说明:

  1. 树的深度不会超过 1000
  2. 树的节点总数不会超过 5000
class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        //特判
        if(root == nullptr) return {};
        vector<vector<int>> res;
        queue<Node*> qu;
        qu.push(root);
        while(!qu.empty()){
            vector<int> temp;
            //每一层的个数
            int size = qu.size();
            for(int i = 0; i < size; i++){
                Node* node = qu.front();
                temp.push_back(qu.front()->val);
                //遍历队头的孩子节点,如果不为空,加入队列
                for (auto node : qu.front()->children) {
                    if (node){
                        qu.push(node);
                    }
                }
                qu.pop();
            }
            res.push_back(temp);
        }
        return res;
    }
};
/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

589. N叉树的前序遍历

难度简单83

给定一个 N 叉树,返回其节点值的前序遍历

例如,给定一个 3叉树 :

img

返回其前序遍历: [1,3,5,6,2,4]

1.递归解法

class Solution {
    vector<int> res;
public:
    vector<int> preorder(Node* root) {
        if(!root)   return{};
        res.push_back(root->val);
        for(auto p : root->children){
            preorder(p);
        }
        return res;
    }
};

2.迭代解法

class Solution {
public:
    vector<int> preorder(Node* root) {
        if(!root)   return{};	//特判
        
        vector<int> res;
        stack<Node*> st;
        
        st.push(root);
        Node* p;
        
        while(!st.empty()){
            p = st.top();
            st.pop();
            res.push_back(p->val);
            int size = p->children.size();
            for(int i = size-1; i>=0; i--){
                st.push(p->children[i]);
            }
        }
        return res;
    }
};

590. N叉树的后序遍历

给定一个 N 叉树,返回其节点值的后序遍历

例如,给定一个 3叉树 :

img

返回其后序遍历: [5,6,3,2,4,1].

分析:多叉树的后序遍历,仍然是左->右->根的顺序,只不过这里的左右是从左到右的顺序。N叉树的前序遍历类似, 但子树的入栈顺序为从左到右,最后将数组反转一下

class Solution {
public:
    vector<int> postorder(Node* root) {
        vector<int> v;

        if(!root) return v;
       
        stack<Node*> s;
        s.push(root);

        while(!s.empty()){
            Node* node = s.top();
            v.push_back(node->val);
            s.pop();

            //从左到右入栈
            for(int i = 0 ; i < node->children.size(); ++i){
                if(node->children.at(i)) //非空结点才入栈
                    s.push(node->children.at(i));
            }
        }

        //将v反转
        reverse(v.begin(), v.end());

        return v;       
    }
};

另外因为多叉树有多个分叉,因此就没有中序遍历的概念了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章