树的遍历

【数据结构】树的遍历、森林的遍历 树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次。 树可被看成是由树的根结点和根结点的所有子树所构成的森林两部分组成。 ​ 阅读详情
#include <iostream>
using namespace std;
#include <stdio.h>
#include <stack>
using std::stack;

template<typename T>
struct Node
{
    Node(T value):mValue(value),mLeftChild(0),mRightChild(0)
    {
    }
    T mValue;
    Node *mLeftChild;
    Node *mRightChild;
};

/* build a tree which is
         1
       /  \
     2      3
    / \    / \
  4    5  6    7
*/
Node<int>*
buildTree()
{
    Node<int> *n1 = new Node<int>(1);
    Node<int> *n2 = new Node<int>(2);
    Node<int> *n3 = new Node<int>(3);
    Node<int> *n4 = new Node<int>(4);
    Node<int> *n5 = new Node<int>(5);
    Node<int> *n6 = new Node<int>(6);
    Node<int> *n7 = new Node<int>(7);
    n1->mLeftChild = n2;
    n1->mRightChild = n3;
    n2->mLeftChild = n4;
    n2->mRightChild = n5;
    n3->mLeftChild = n6;
    n3->mRightChild = n7;
    return n1;
}

template<typename T>
void
bfsTravesal(Node<T> *root)
{
    deque<Node<T> *> result;
    result.push_back(root);
    while( result.size() )
    {
        Node<T> *head = result.front();
        result.pop_front();
        cout << head->mValue<<" ";
        if ( head->mLeftChild )
        {
            result.push_back(head->mLeftChild);
        }
        if ( head->mRightChild )
        {
            result.push_back(head->mRightChild);
        }
    }
}

template<typename T>
void
preOrderTraversal(Node<T> *node)
{
    if ( 0 == node )
        return ;
    cout << node->mValue << " ";
    preOrderTraversal(node->mLeftChild);
    preOrderTraversal(node->mRightChild);
}

template<typename T>
void
inOrderTraversal(Node<T> *node)
{
    if (0 == node)
    {
        return ;
    }
    inOrderTraversal(node->mLeftChild);
    cout << node->mValue << " ";
    inOrderTraversal(node->mRightChild);
}

template<typename T>
void
postOrderTraversal(Node<T> *node)
{
    if (0 == node)
    {
        return ;
    }
    postOrderTraversal(node->mLeftChild);
    postOrderTraversal(node->mRightChild);
    cout << node->mValue << " ";
}

template<typename T>
void
preOrderNoneRecursiveTravesal (Node<T> *node)
{
    stack<Node<T> *> s;
    while (node!=NULL||!s.empty())
    {
        if ( 0 != node )
        {
            cout << node->mValue << " ";
            s.push(node);
            node = node->mLeftChild;
        }
        else
        {
            node = s.top();
            node = node->mRightChild;
            s.pop();
        }
    }
}

template<typename T>
void
inOrderNoneRecursiveTravesal (Node<T> *node)
{
    stack<Node<T> *> s;
    Node<T> *currentNode = node;
    while (currentNode!=NULL || !s.empty())
    {
        while (node)
        {
            s.push(node);
            node = node->mLeftChild;
        }
        if( ! s.empty() )
        {
            node = s.top();
            s.pop();
            cout << node->mValue<<" ";
            node = node ->mRightChild;
        }
    }
}

template<typename T>
void
postOrderTraversal (Node<T> *node)
{

}

int main(int argc,char *argv[])
{
    Node<int> *root = buildTree();
    inOrderNoneRecursiveTravesal(root);
    cout << "inOrderNoneRecursiveTravesal finish "<<endl;

    preOrderNoneRecursiveTravesal(root);
    cout << "preOrderNoneRecursiveTravesal finish "<<endl;

    bfsTravesal(root);
    cout << "bfs end"<<endl<<endl;

    preOrderTraversal(root);
    cout << "preOrderTraversal"<<endl<<endl;

    inOrderTraversal(root);
    cout << "inOrderTraversal"<<endl<<endl;

    postOrderTraversal(root);
    cout << "postOrderTraversal"<<endl<<endl;
    return 0;
}


        
金蝶K3系统物料主数据后台表对应字段一览 我们说到物料表,一般是指t_icitem,但正确的说t_icitem并不是一张有,而是一张视图,不过我们对于数据库物料表中的大部分操作,都是通过此视图来完成。比如经常通过此视图,来成批修改数量,单价精度,是否启用批次等一些字段,有的时候,对于账套已经启用,并且已经有业务发生的物料,有一些关键属性也需要通过修改物料表t_icitem来进行。 当然修改的时候,需要考虑一些前提条件的。 比如说我有一个客户新建的账套,在月底结账时发现,要改一种成本核算方法,启用时用的是加权平法,现在想改成移动平均法,这样的情况, 阅读详情

相关推荐

Python实战:如何用高德API批量获取POI数据(附完整代码)

本文详细介绍了如何使用Python通过高德API批量获取POI数据,包括API基础准备、核心功能模块设计、高级功能实现及实战应用案例。文章提供了完整代码示例,帮助开发者高效解决商业网点分析、公共设施规划等实际项目中的数据采集需求。

stem5的博客 321

普通有序树的遍历

原题题目描述输入一棵普通有序树,输出该树的先根次序和后根次序。输入第1行:顶点个数n(1≤n≤200)以下含n行,其中第i行(1≤i≤n)的元素依次为结点i的数据值ai。以后各元素为结点i的儿子序列,以0结束。若ai后仅含一个0,则说明结点i为叶子。输出第1行:先根序第2行:后根序样例输入18 r 2 3 4 0 a 5 6 0 b 7 0 c 8 9 10 0 w 0 x 11 12

XiaoZheng的博客 4339

vue高德地图POI关键字搜索定位

最近在项目中遇到了关于地图的问题,首先为了满足需求从而使用的是JSAPI为2.0版本的。需求是根据关键字搜索定位到该位置。值得注意的是在使用 AMap.Event.addListener时 Event一定要大写的E,不然页面会报错。在地图上定义一个输入框,根据输入的位置进行提示,然后点击后跳转到对应的位置并打点标记。JSAPI主要使用这两个。

YL 2135

一个填空选择题(有序树和二叉树遍历关系)

假如N是由一棵有序树T转换而来的二叉树,那么T中的节点的后序遍历顺序是N节点的() A.先序遍历 B.中序遍历 C.后序遍历 D.层次遍历 正确答案:B 如果T2是由有序树T转换而来的二叉树,那么T中结点的前序就是T2中结点的前序,T中结点的后序就是T2中结点的中序 就这2句话 记得就行...

~ 2508

gephi生成网络关系图_路网拓扑重建专题 (3) 网络图生成

城市道路网建模在获得基础路网之后,需要考虑道路交通网络的描述与表达问题。网络是将现实世界中的事物及其关系进行适当的抽象,构造成由节点和边按照一定规则组成的形式。一个实体网络可以由有限个“节点”集合与“边”集合构成的图表示,即网络表示为。对于一个由个节点组成的无权复杂网络,该图有邻接矩阵,这里。根据研究对象不同,建模方法主要包括原始法[1]和对偶法[2]两种,见图1,字母a-j为交叉口编号...

weixin_39761195的博客 3502

逆概率加权法(Inverse Probability Weighting, IPW)的原理及R实现

逆概率加权(IPW)是一种用于解释由于非随机选择观测值或人群信息的非随机缺失而造成的缺失和选择偏差的方法。原理:这种方法可以通过对观察值的加权来修正分析,使其具有被选中的概率。IPW是基于这样一个假设,即整个研究人群都有可以预测纳入概率(非遗漏)的个体信息,因此,在考虑到这些信息后,我们可以仅从非遗漏的观察值开始对整个目标人群进行推断。计算的程序如下:首先,我们考虑整个研究人群,用逻辑回归模型计算非失访信息的概率,其中响应是非失访,协变量是其可能的预测因素。每个受试者的权重是由预测概率的倒数给出的。然后使用

Christina 5万+

有序遍历

1. 先序遍历:根左右,中序遍历:左根右,后序遍历:左右根 2.表达式:a+b*(c-d)-e/f的二叉树为 则先序遍历为 -+a*b-cd/ef 中序遍历为 a+b*(c-d)-e/f 后序遍历为 abcd-*+ef/- 3.已知先序遍历为abdgcefh,中序遍历为dgbaechf,求二叉树及后续遍历 分析:先序遍历的第一个字符为根节点。对于中序遍历,根节点在...

weixin_30576859的博客 358

电机控制框架选型指南:从TI MotorWare到ST MC SDK,5种架构优缺点对比

本文深入对比了TI MotorWare、ST MC SDK、AUTOSAR、FPGA+ARM及集成方案等五种主流电机控制软件框架的架构特点、实时性、开发效率与硬件兼容性。通过工业伺服和消费电子的实战案例分析,为工程师提供了清晰的选型逻辑与决策清单,旨在帮助规避技术债务,选择最适合项目需求的电机控制框架。

rnn9storyteller的博客 1174

某二叉树的先根遍历序列和后根遍历序列正好相反,则该二叉树具有的特征是()----腾讯2016研发工程师在线模拟笔试题

某二叉树的先根遍历序列和后根遍历序列正好相反,则该二叉树具有的特征是() 正确答案: A    高度等于其结点数 任一结点无左孩子 任一结点无右孩子 空或只有一个结点 添加笔记 收藏 纠错 原理如下: 先序遍历顺序是:M-L-R; 后序遍历顺序是:L-R-M; 可以看到,只有中间的结

chengonghao的博客 1万+

monocle3-单细胞轨迹分析在疾病研究中的应用

本文深入探讨了monocle3在单细胞轨迹分析中的核心应用,特别是在疾病研究领域。通过实战案例,详细讲解了如何利用monocle3进行轨迹推断,构建细胞状态演变的“路线图”,并结合伪时间分析定位疾病进展阶段。文章还介绍了如何挖掘驱动疾病发展的关键基因,并分享了数据整合、根节点选择等进阶技巧与避坑指南,旨在帮助研究者利用这一强大工具揭示肿瘤异质性、免疫治疗耐药等复杂生物学过程的动态机制。

a3b4c5的博客 638

FPGA实战:基于Basys3的多功能数字钟设计与实现

本文详细介绍了基于Basys3开发板的多功能数字钟设计与实现过程,涵盖FPGA开发、SystemVerilog编程及7段数码管驱动等关键技术。通过模块化设计实现时钟分频、时间计数、按键处理等功能,并提供了优化显示驱动和调试技巧,帮助开发者快速掌握数字电路设计核心概念。

weixin_29186249的博客 659

BFS遍历树和DFS遍历树

遍历树 按照遍历的顺序,绘制成树型结构 DFS遍历树 以下为图到遍历树的转化(如果不清楚图的遍历,请先阅读笔者的另一篇文章:图的遍历(动图)),按照DFS遍历的顺序,绘制成一棵树,途中红色的边就是遍历过程中没有经过的边(在遍历树上,红色的边其实是不存在的,只是为了和图做比对和便于后面的分析,笔者在遍历树上绘制出来了) 从遍历树中可以看出,非遍历的边可以指向自己的祖先节点(即后向边),而查找桥的算...

z13192905903的博客 2169

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

树的遍历总结

本文总结一下树的几种遍历方法,分别是前序,前序非递归,中序,中序非递归,后序,后序非递归,按层次遍历,这7种。 前序遍历 先打印当前节点,再用前序遍历的方法遍历左右子树。 前序遍历非递归 遍历到当前节点,如果非空,打印这个节点,将其入栈,指向其左子节点,否则,出栈一个元素(这个元素的左子树遍历完毕),指向其右子节点。 中序遍历 用中序遍历的方法遍历左子树,打印当前节点,用中序遍历的方法打印右子数。...

yay1994的博客 1655

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

关于树的遍历

该文章中的题目与“二叉树的遍历”思路有许多相似之处,可以对照着学习加深印象

DaisyMaria的博客 901

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

树的层次遍历

树的层次遍历,顾名思义就是在一颗树中按从左到右的顺序一层一层的遍历,这看似简单,但我们创建树时通常是根节点指向它的孩子结点,兄弟结点之间要怎么联系?这里我们可以转换一下思维,我们能不能把树每一层的结点按从左到右的顺序依次放到一个空间,然后依次输出,这样不就为每层的兄弟结点创建了联系。为了实现这样的效果,我们可以用到我们学过的一种很重要的数据结构——队列 首先我们以二叉树为例 1、先把树的根节点放入队列中 2、判断队列是否为空,若不为空执行3,4 3、如果左孩子不为空,左孩子进队列 4、如果由孩子不为空,右孩

Sveinn的博客 4461

java 树的各种遍历

基础知识 树是一个有n个有限节点组成一个具有层次关系的集合,每个节点有0个或者多个子节点,没有父节点的节点称为根节点,也就是说除了根节点以外每个节点都有父节点,并且有且只有一个。 树的种类比较多,有二叉树,红黑树,AVL树,B树,哈夫曼树,字典树等等。 甚至堆我们也可以把它看成是一棵树,树的这么多种类中,我们最常见的应该是二叉树了,下面我们来看一下他的结构。 定义: 1,结点的度: 一个结点含有的子结点的个数称为该结点的度; 2,叶结点或终端结点: 度为0的结点称为叶结点; 3,非终端结点或分支结点: 度

倒骑驴走着瞧的博客 7276

树的四种遍历方式c++

树的常用的遍历方式有四种,分别为前序遍历,中序遍历,后续遍历和层次遍历,下面的代码依次实现了它们的递归以及非递归方法。 // tree.cpp : 此文件包含 &quot;main&quot; 函数。程序执行将在此处开始并结束。 // #include &quot;pch.h&quot; #include &amp;lt;iostream&amp;gt; #include&amp;lt;stack&amp;gt; #include&a

qq_37891889的博客 7693

树的遍历(Java)

题目描述 实现树的前序,中序,后序遍历 解决 前序和后序用的比较少,直接用递归了,中序用的比较多,用两种实现方式 树的节点 class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 三种遍历 public class So...

LrvingTc的博客 1万+

树的顺序遍历

树是一个优美的数据结构,在掌握了树的概念之后,首先需要知道的就是树的顺序遍历。 先序遍历 树的先序遍历是对于每一个子树(包括本身)以中(根节点)->右儿子->左儿子的顺序进行的遍历 void Build(){ printf("%d\n",root); Build(lson); Build(rson); } 中序遍历 树的中序遍历是对于每一个子树(包括本...

bangwo9535的博客 450

树的前序遍历、中序遍历、后序遍历详解

树的前序遍历、中序遍历、后序遍历详解 1.前序遍历 图1 对于当前节点,先输出该节点,然后输出他的左孩子,最后输出他的右孩子。以上图为例,递归的过程如下: (1):输出 1,接着左孩子; (2):输出 2,接着左孩子; (3):输出 4,左孩子为空,再接着右孩子; (4):输出 6,左孩子为空,再接着右孩子; (5):输出 7,左右孩子都为空,此时 2 的左子树全部输出,2 的右子树为空,此时 ...

Masterheaven的博客 1451

树的遍历及根据遍历顺序反推树的形状

三种遍历顺序 以上是网上随便找的一个树 前序遍历:FCADBEHGM(根左右) 中序遍历:ACBDFHEMG(左根右) 后序遍历:ABDCHMGEF(左右根) 中序遍历步骤 中序遍历的规则是【左根右】,我们从root节点A看起; 此时F是根节点,遍历F的左子树; F的左子树存在,找到C,此时C看做根节点,遍历C的左子树; C的左子树存在,找到A,此时A看做根节点,遍历A的左子树; A的左子树不存在,返回A,根据【左根右】的遍历规则,记录A,遍历A的右子树;(此时记录顺序为:A) A的右子树不存在,返回C,

weixin_42144277的博客 1005
上一篇: 在二元树中找出和为某一值的所有路径
下一篇: c语言中format不同的数据匹配的不同数据格式
乔巴好萌
博客等级 码龄15年 228粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值