N叉树的操作

父节点有且最多只有两个子节点的树称为二叉树,N叉树则是父节点有N个子节点。
由于N叉树有多个子节点,因此没有中序遍历,只剩下前序遍历、后序遍历和层序遍历。


前序遍历

和二叉树类似,遍历的顺序是
根节点-左子节点-其他子节点-右子节点

前序遍历的结果:[1,3,5,6,2,4]

    public List<Integer> preorder(Node root) {
        List<Integer> list=new ArrayList<Integer>();
        if(root==null){
            return list;
        }
        list.add(root.val);
        for(int i=0;i<root.children.size();i++){
            list.addAll(preorder(root.children.get(i)));
        }

        return list;
    }

后序遍历

子节点放前根结点放后,上图
后序遍历的结果:[5,6,3,2,4,1]

    public List<Integer> postorder(Node root) {
        ArrayList<Integer> list=new ArrayList<Integer>();
        if(root==null){
            return list;
        }

        for(int i=0;i<root.children.size();i++){
            list.addAll(postorder(root.children.get(i)));
        }
        list.add(root.val);

        return list;
    }

层序遍历

层序遍历的结果:
[
[1],
[3,2,4],
[5,6]
]

    public List<List<Integer>> levelOrder(Node root) {
        ArrayList<Integer> levelList=new ArrayList<Integer>();
        ArrayList<List<Integer>> list=new ArrayList<List<Integer>>();

        LinkedList<Node> stack=new LinkedList<Node>();
        stack.offer(root);
        while(!stack.isEmpty()){
            int size=stack.size();
            for(int i=0;i<size;i++){
                Node node=stack.poll();
                if(node==null)continue;
                for(int j=0;j<node.children.size();j++){
                    stack.offer(node.children.get(j));
                }
                levelList.add(node.val);
            }
            if(levelList.size()>0)
            list.add(levelList);
            levelList=new ArrayList<Integer>();
        }
        return list;
    }

N叉树的深度

    public int maxDepth(Node root) {
        if(root==null){
            return 0;
        }
        int max=0;
        for(int i=0;i<root.children.size();i++){
            int temp=maxDepth(root.children.get(i));
            if(temp>max){
                max=temp;
            }
        }
        return max+1;
    }

由于N叉树没有什么特别的性质,所以常见的操作不是很多,全部的代码在GitHub,所采用的序列化为Json。

在C++中实现N叉树(N-ary Tree)是一种常见的数据结构操作,适用于需要处理多分支结构的场景,例如文件系统、组织结构或树形菜单等。N叉树的每个节点可以拥有最多N个子节点。下面将从结构定义、节点创建、插入操作遍历方法几个方面来实现一个基本的N叉树。 ### 结构定义 N叉树的节点通常包含一个值(value)和一个子节点的容器,例如使用`std::vector`来存储子节点指针: ```cpp #include <vector> struct Node { int value; std::vector<Node*> children; Node(int val) : value(val) {} }; ``` ### 节点创建 与二叉树类似,可以定义一个函数来创建一个具有指定值的节点,并初始化其子节点容器为空: ```cpp Node* createNode(int value) { Node* newNode = new Node(value); return newNode; } ``` ### 插入操作 插入操作通常是在某个现有节点下添加一个子节点。例如,可以定义一个函数,将新节点作为指定父节点的子节点添加进去: ```cpp void addChild(Node* parent, Node* child) { if (parent != nullptr) { parent->children.push_back(child); } } ``` ### 构建N叉树示例 以下是一个构建简单N叉树的示例,其中根节点有三个子节点,其中一个子节点又有两个子节点: ```cpp int main() { // 创建根节点 Node* root = createNode(1); // 创建子节点 Node* child1 = createNode(2); Node* child2 = createNode(3); Node* child3 = createNode(4); // 添加子节点到根节点 addChild(root, child1); addChild(root, child2); addChild(root, child3); // 创建孙子节点 Node* grandChild1 = createNode(5); Node* grandChild2 = createNode(6); // 添加孙子节点到child1 addChild(child1, grandChild1); addChild(child1, grandChild2); // 后续可进行遍历或其他操作 return 0; } ``` ### 遍历操作 N叉树遍历可以采用深度优先或广度优先的方式。以下是深度优先遍历的递归实现: ```cpp #include <iostream> void dfs(Node* node) { if (node == nullptr) return; std::cout << node->value << " "; for (Node* child : node->children) { dfs(child); } } ``` 广度优先遍历可以使用队列实现: ```cpp #include <queue> void bfs(Node* root) { if (root == nullptr) return; std::queue<Node*> q; q.push(root); while (!q.empty()) { Node* current = q.front(); q.pop(); std::cout << current->value << " "; for (Node* child : current->children) { q.push(child); } } } ``` ### 应用场景 N叉树广泛应用于: - **文件系统**:表示目录结构,每个目录可以包含多个子目录和文件。 - **组织结构**:表示公司或机构的层级关系。 - **UI组件结构**:用于表示用户界面中的嵌套组件。 - **游戏开发**:用于表示游戏中的场景树或对象树。 通过上述方法,可以在C++中实现一个基本的N叉树结构,并根据具体需求扩展其功能,如删除节点、查找节点、序列化/反序列化等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值