首页 > 其他分享 >二叉树的先序遍历

二叉树的先序遍历

时间:2024-08-23 20:28:52浏览次数:7  
标签:结点 遍历 val BiTNode 二叉树 先序

二叉树先序遍历(按照根-左-右次序访问节点)

以下图为例:

先序遍历序列应为:1 2 4 8 9 5 10 3 6 7

分别用递归算法和非递归算法得到上述例子的先序遍历序列(这里采用先序+为叶子节点添加‘-1’作为孩子节点来唯一确定一棵二叉树,非递归代码中,注意遍历过的结点加入栈中,这样当遍历完左子树的时候可以从栈中取出他的根结点,从而遍历右子树。

#include<bits/stdc++.h>
using namespace std;

typedef struct BiTNode{
    int val;//根节点的值 
    struct BiTNode *lchild,*rchild;//左孩子指针 右孩子指针 
}BiTNode,*BiTree;
//二叉树构造函数 
BiTree createTree(){
    int val;
    cin>>val;
    if(val==-1) return NULL;
    BiTNode *T=(BiTNode *)malloc(sizeof(BiTNode));
    T->val =val;
    T->lchild =createTree();
    T->rchild =createTree();
}
//递归法遍历 
void preorder(BiTree T){
    if(T){//这里不加非空判断,不然遇到叶子结点后就不能递归下去了 
    cout<<T->val<<" ";//遍历根结点 
    preorder(T->lchild);//遍历左子树 
    preorder(T->rchild);//遍历右子树 
    }
}
//非递归法遍历
void preorder1(BiTree T){
    if(!T) return;
    stack<BiTNode *> st;//初始化栈 
    BiTNode *p=T;//用一个p指针来遍历 
    while(p||!st.empty()){//循环条件:当前结点不为空或者栈不为空(重要!!!) 
    if(p){//若当前结点不为空 
        cout<<p->val <<" ";//遍历当前结点 
        st.push(p);//遍历过的节点进栈 
        p=p->lchild ;//访问左子树结点 
      }
    else{//当前结点为空 
        p=st.top();//取出栈顶元素 
        st.pop();//弹出栈顶元素 
        p=p->rchild ;//访问右子树节点 
    }
    }
} 

int main(){
    BiTree T=createTree();
    cout<<"递归遍历结果:"<<endl;
    preorder(T);
    cout<<endl;
    cout<<"非递归遍历结果:"<<endl;
    preorder1(T); 
    return 0;
}

//二叉树先序序列:1 2 4 8 -1 -1 9 -1 -1 5 10 -1 -1 -1 3 6 -1 -1 7 -1 -1
//递归遍历:1 2 4 8 9 5 10 3 6 7
//非递归遍历:1 2 4 8 9 5 10 3 6 7 

标签:结点,遍历,val,BiTNode,二叉树,先序
From: https://www.cnblogs.com/doris510/p/18377028

相关文章

  • 【数据结构】总结二叉树的概念以及存储结构
    目录1.树的概念及结构1.1树的名词定义1.2树的表示2.二叉树的概念及结构 2.1二叉树的概念2.2特殊的二叉树2.2.1满二叉树2.2.2完全二叉树2.3 二叉树的存储结构2.3.1顺序存储2.3.2链式存储3.选择题1.树的概念及结构1.1树的名词定义1.节点的度:......
  • 知识改变命运 数据结构 【二叉树】
    1.树型结构(了解)1.1概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:有一个特殊的结点,称为根结点,根结点没有前驱结点除根结点外,其余结点被分成M......
  • set 的详细用法(set 排序、set 的遍历、set 的多种倒序遍历方法、set 的基本成员函数)
    目录一:set的简介二:set的使用(要包含头文件)1.set的定义2.set的基本成员函数3.set的遍历(1)迭代器iterator(即升序输出)(2)倒序输出1.rbegin()和rend()2.当然,也可以逆向思维一下。​^^3.用greater实现降序排列三:应用基本成员函数的代码【总结】有上述代码可以看出,插......
  • 二叉树的经典OJ题
    前言Helllo,今天,博主将要带领大家来深度解析几道经典的二叉树OJ题,来巩固我们前面学过的二叉树知识,我们在进行二叉树练习的时候,还是要对二叉树有较为深入的认识,所以新来的小伙伴,博主强烈推荐可以先去看看博主之前的文章:http://t.csdnimg.cn/VOQ1Shttp://t.csdnimg.cn/dijrW......
  • 批量图像识别的快速遍历技巧
    此文章来源于项目官方公众号:“AirtestProject”版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途一、前言最近,不少同学在Q群中频繁提出疑问:在日常UI测试过程中,如何快速准确地识别页面上的多个元素,或在日常测试中,如何高效地遍历目标图片列表,以确认画面中是否包......
  • df.iterrows() 是 Pandas 中的一个方法,用于在遍历 DataFrame 时,逐行返回每一行的索引
    df.iterrows()是Pandas中的一个方法,用于在遍历DataFrame时,逐行返回每一行的索引和数据。它生成一个迭代器,每次迭代时返回一个(index,Series)对,index是行索引,Series是该行的数据。详细解释df.iterrows():这个方法遍历DataFrame的每一行。每次迭代时,返回的是(ind......
  • 信息学奥赛初赛天天练-71-NOIP2016普及组-基础题2-进制转换、二进制转八进制、八进制
    NOIP2016普及组基础题24以下不是CPU生产厂商的是()AIntelBAMDCMicrosoftDIBM8与二进制小数0.1相等的八进制数是()A0.8B0.4C0.2D0.19以下是32位机器和64位机器的区别是()A显示器不同B硬盘大小不同C寻址......
  • 二叉树的序列化和反序列化(Java)
    概述关于面试中常见的其他二叉树算法题,参考面试+算法之二叉树(Java)。二叉树的定义(注意到有使用lombok提供的两个注解):@[email protected]{privateTreeNodeleft;privateTreeNoderight;privatefinalint......
  • 二叉树入门学习 优势对比 以及 完全二叉树c++代码的实现
    二叉树介绍文档一、概述二叉树是一种常见的数据结构,它是一种树形结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的基本概念如下:节点(Node):二叉树的基本单元,包含一个值以及指向左右子节点的引用。根节点(Root):树的顶端节点,没有父节点。叶子节点(Leaf):没有子节......
  • 头歌 第4关:层次遍历二叉树
    任务描述本关任务:给定一棵二叉树,借助队列实现层次遍历二叉树。相关知识为了完成本关任务,你需要掌握:1.队列的类型定义及基本操作,2.二叉树层次遍历。队列的类型定义及基本操作队列的类型定义:#define MAXSIZE100  //最大长度typedefBiTNode*QElemType;//队列中......