首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在c++中遍历通用树

在C++中遍历通用树的方法有多种,以下是其中几种常用的方法:

  1. 递归遍历: 递归是一种简单直观的遍历通用树的方法。通过递归函数,可以依次访问树的每个节点,并对其进行相应的操作。递归遍历通用树的常用方法有前序遍历、中序遍历和后序遍历。
  • 前序遍历:先访问根节点,然后递归遍历左子树,最后递归遍历右子树。
  • 中序遍历:先递归遍历左子树,然后访问根节点,最后递归遍历右子树。
  • 后序遍历:先递归遍历左子树,然后递归遍历右子树,最后访问根节点。

以下是一个示例代码,展示了如何使用递归遍历通用树:

代码语言:cpp
复制
struct TreeNode {
    int val;
    vector<TreeNode*> children;
};

void traverse(TreeNode* root) {
    if (root == nullptr) {
        return;
    }
    
    // 前序遍历
    cout << root->val << " ";
    
    for (TreeNode* child : root->children) {
        traverse(child);
    }
    
    // 后序遍历
    // cout << root->val << " ";
}

int main() {
    // 构建通用树
    TreeNode* root = new TreeNode{1, {
        new TreeNode{2, {
            new TreeNode{5, {}},
            new TreeNode{6, {}}
        }},
        new TreeNode{3, {}},
        new TreeNode{4, {}}
    }};
    
    // 遍历通用树
    traverse(root);
    
    return 0;
}
  1. 迭代遍历: 除了递归遍历,还可以使用迭代的方式遍历通用树。迭代遍历通用树通常借助栈或队列来实现。
  • 层序遍历:使用队列实现,先将根节点入队,然后依次出队并访问节点,将其子节点入队,直到队列为空。
  • 其他遍历方式:使用栈实现,先将根节点入栈,然后循环出栈并访问节点,将其子节点入栈,直到栈为空。

以下是一个示例代码,展示了如何使用迭代遍历通用树:

代码语言:cpp
复制
struct TreeNode {
    int val;
    vector<TreeNode*> children;
};

void traverse(TreeNode* root) {
    if (root == nullptr) {
        return;
    }
    
    stack<TreeNode*> stk;
    stk.push(root);
    
    while (!stk.empty()) {
        TreeNode* node = stk.top();
        stk.pop();
        
        // 前序遍历
        cout << node->val << " ";
        
        // 将子节点逆序入栈
        for (int i = node->children.size() - 1; i >= 0; i--) {
            stk.push(node->children[i]);
        }
        
        // 后序遍历
        // cout << node->val << " ";
    }
}

int main() {
    // 构建通用树
    TreeNode* root = new TreeNode{1, {
        new TreeNode{2, {
            new TreeNode{5, {}},
            new TreeNode{6, {}}
        }},
        new TreeNode{3, {}},
        new TreeNode{4, {}}
    }};
    
    // 遍历通用树
    traverse(root);
    
    return 0;
}

以上是在C++中遍历通用树的两种常用方法。根据具体的需求和场景,选择递归遍历或迭代遍历的方式来实现对通用树的遍历操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

前序、序、后序遍历二叉通用公式

左右,即先自身、再左边、后右边 注意:我这里用的概念是“”,而不是“节点”,就是把每一个节点都当成一颗 根据规则,先遍历当前,当前的根节点是A,所以首先遍历的就是A ?...,也就是二叉C 把C作为一棵独立的进行前序遍历 根据“左右”的次序,先遍历当前的根节点C,所以目前的遍历次序就是A->B->D->E->H->C ?...同样的遍历的顺序就是“左右”、后序遍历的顺序就是“左右” 左右的相对位置不变,前、、后指的其实就是““左右”的位置 2....代码实现 还是以前序遍历为例,根据“左右”的通用公式 采用递归的方法,一次拿到每棵的左、、右三个节点的内容 然后再按照、左、右的次序加入一个列表,就能实现二叉的前序遍历了 2.1 前序遍历 public...遍历也是几乎同样的代码 只不过加入列表的顺序改成左、、右就可以了 public List inorderTraversal(TreeNode root) { List

97741

二叉通用遍历模板

遍历一棵二叉,主要分为前序遍历遍历和后序遍历三种方式,不同的方式输出的顺序不同: 前序遍历: 根节点->左节点->右节点 遍历: 左节点->根节点->右节点 后序遍历: 左节点->右节点->...根节点 本文将介绍递归、迭代、标记迭代以及莫里斯迭代四种方式的通用模板,对二叉分别进行前后序遍历,以及每种方式的特点。...因为递归过程中会用到logn的栈空间,如果一棵所有节点都只有右节点或左节点,也就是说变成了一个链表,那么会用到O(n)的栈空间,所以最坏情况下,空间复杂度是O(n)。...标记迭代 相较于普通迭代,标记迭代显得更容易理解,它除了辅助栈缓存节点外,还额外记录了这个节点的状态(0、1表示),0表示未访问,1表示已访问,第一次进栈的节点都是未访问状态,只有第二次进栈才会标记为已访问...continue else: res.append(root.val) root=root.left return res[::-1] 莫里斯迭代

22320

前序遍历遍历构造二叉

题意 根据前序遍历遍历构造二叉. 注意事项: 你可以假设不存在相同数值的节点 样例 给出遍历:[1,2,3]和前序遍历:[2,1,3]....返回如下的: 2 / \ 1 3 思路 根据前序遍历遍历的规律可得: 前序遍历的第一个就是整个的根节点 这个根节点在遍历的左侧是其左子树,右侧是右子树。...将每一个节点都看作是一个单独的,根据此 规律1 和 规律2 依次递归获取其左右子树的前序与遍历,直到前序遍历遍历的长度仅剩1,则说明该节点为叶子节点,从而构造整棵。...TreeNode treeRoot = new TreeNode(root); int flag = -1; // flag用于存放根节点root遍历的位置 for (int...treeRoot.right = buildTree(child_PreorderRight,child_InorderRight); return treeRoot; } } 原题地址 LintCode:前序遍历遍历构造二叉

1.7K40

遍历--的广度遍历(层次遍历),深度遍历(前序遍历遍历,后序遍历的递归和非递归实现)

spring-jpa,webjars,Aspect,drools-drt,rabbitmq,zookeeper,mongodb,mysql存储过程,前端的延迟加载,netty,postgresql 这次就来整合下 遍历...前序遍历遍历,后序遍历的区别就是根在前(根左右),根(左根右),根在后(左右根) 最后补全所有源码 二 广度优先遍历 层次遍历 //广度优先遍历 层次遍历 public...//遍历 public void inOrder(TreeNode subTree) { if (subTree !...= null) { //递归左子树搜索 return p; } else { //递归右子树搜索...)遍历*****************"); bt.preOrder(bt.root); System.out.println("*******(遍历)遍历***

4.6K40

二叉---(3)前序遍历遍历,后序遍历

很多朋友刚开始接触二叉时,对前序遍历遍历,后序遍历这三个遍历方式不太了解,很多博客,上来就是实现方式,并没有清晰的阐述这三种遍历的步骤和顺序,这里记录一下。        ...所谓遍历(Traversal)是指沿着某条搜索路线,依次对每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。...遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。         按照根节点位置的不同分为前序遍历遍历,后序遍历。...前序遍历:根节点->左子树->右子树 遍历:左子树->根节点->右子树 后序遍历:左子树->右子树->根节点 注意:在做前序遍历时,左右子树也是按照前序遍历的顺序, 同理,在做遍历时,左右子树也是按照遍历的顺序...例1:求下面的三种遍历 ? 前序遍历:abdefgc 遍历:debgfac 后序遍历:edgfbca 例2:求下面的三种遍历 ?

65920

二叉的先序遍历遍历、后序遍历

1 问题 Python中二叉的先序遍历遍历、后序遍历。 2 方法 先序遍历的递归算法定义: 若二叉非空,则依次执行如下操作: ⑴ 访问根结点; ⑵ 遍历左子树; ⑶ 遍历右子树。...遍历的递归算法定义: 若二叉非空,则依次执行如下操作: ⑴ 遍历左子树; ⑵ 访问根结点; ⑶ 遍历右子树。...后序遍历的递归算法定义: 若二叉非空,则依次执行如下操作: ⑴ 遍历左子树;⑵ 遍历右子树;⑶ 访问根结点。...:') btree.front_search(btree.base) print('遍历:') btree.middle_search(btree.base) print('后序遍历:') btree.behind_search...(btree.base) 3 结语 我们针对Python中二叉的先序遍历遍历、后序遍历的问题,运用书上相应的基础知识,通过代码运行成功证明该方法是有效的,二叉遍历的应用非常广泛,希望通过未来的学习我们能写出更多长的

15710

遍历(已知前序遍历遍历求后序遍历,或者已知后序序求先序)

假设是1000个结点以内, 输入前序  4 1 3 2 6 5 7        序  1 2 3 4 5 6 7  得到后续  2 3 1 5 7 6 4 已知前序遍历遍历求后序遍历: import...,建树 // @param pre 先序遍历的数组 // @param lo 先序遍历的起点下标 // @param in 遍历的数组 // @param ini 遍历的起点下标...ini + i + 1, n - i - 1); // 右区间 // 最后一个参数是这个子树的有多少结点 return node; } } 题目描述 输入某二叉的前序遍历遍历的结果...,请重建出该二叉。...假设输入的前序遍历遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和遍历序列{4,7,2,1,5,3,8,6},则重建二叉并返回。

25320

二叉的先序遍历 遍历 后序遍历 层序遍历

对于深度为K的,有n个结点的二叉,当且仅当其每一个结点都与深度为K的满二叉编号从1至n的结点一一对应时称之为完全二叉。 要注意的是满二叉是一种特殊的完全二叉。...也就是说,如果一个二叉的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉 二叉遍历 先序遍历 :先遍历根节点,再遍历左节点,最后遍历右节点 遍历 :先遍历左节点,再遍历根节点,最后遍历右节点...后序遍历 :先遍历左节点,再遍历右节点,最后遍历根节点 层序遍历 : 自上而下,自左至右逐层访问的结点的过程就是层序遍历 遍历方法的实现 先建立一棵 用代码建立以上树 class Node...System.out.print(root.val+" "); preOrder(root.left); preOrder(root.right); } 下面进行遍历...= null){ stack.push(top.left); } } } // 二叉遍历,非递归迭代实现

1K20
领券