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

遍历二叉树

时间:2024-01-20 16:55:05浏览次数:20  
标签:遍历 cur 二叉树 push NULL root 节点

二叉树

前言

二叉树的遍历主要有深度优先遍历和广度优先遍历,深度优先遍历是优先访问一个子树上的所有节点,访问的属性是竖向的,而广度优先遍历则是优先访问同一层的所有节点,访问属性是横向的。

深度优先遍历

深度优先遍历主要有三种顺序:

  • 前序遍历 —— 根左右
  • 中序遍历 —— 左根右
  • 后序遍历 —— 左右根

这三种遍历顺序用递归可以很容易实现,主要讲的是非递归的实现方法。而要使用迭代的方法来遍历二叉树,需要用到栈的特性。

前序遍历(非递归C++)

算法:

  1. 根节点入栈
  2. 访问栈顶元素并将其出栈
  3. 将左右子树入栈,由于访问顺序是"根左右",且使用的是栈,因此右子树先于左子树入栈
  4. 重复步骤2、3,直到栈为空
void preOrder(BTNode* root) {
    stack<BTNode*> S;
    BTNode* cur = NULL;
    if(root == NULL)
        return;
    S.push(root);   //根节点入栈
    while(!S.empty()) {
        //访问顺序"根左右"
        cur = S.top();
        cout<<""<<cur->data<<"\n";
        //出栈访问过的节点
        S.pop();
        //先入栈右子树,这样就可以先访问左子树
        if(cur->right != NULL)
            S.push(cur->right);
        if(cur->left != NULL)
            S.push(cur->left);
    }
}

中序遍历(非递归C++)

算法:

  1. 根节点入栈
  2. 遍历左孩子节点,入栈,直到左子树为空
  3. 访问栈顶节点并将栈顶节点出栈
  4. 对右子树进行步骤2、3,访问当前节点的右子树
  5. 重复步骤2、3、4,直到栈空
void midOrder(BTNode* root) {
    stack<BTNode*> S;
    BTNode* cur = NULL;
    if(root == NULL)
        return;
    S.push(root);   //根节点入栈
    cur = root;
    while(!S.empty()) {
        //访问顺序"左根右"
        while(cur) {    //将左孩子依次入栈
            S.push(cur);
            cur = cur->left;
        }
        //访问最左孩子
        cur = S.top();
        cout<<""<<cur->data<<"\n";
        S.pop();
        //对右子树进行一样的操作
        cur = cur->right;
    }
}

层次遍历

层次遍历就是广度优先遍历,需要使用队列的特性FIFO

算法:

  1. 根节点入队
  2. 若队列非空,出队一个元素并访问,接着将其左右孩子入队
  3. 重复步骤2直至队空
void levelOrder(BTNode* root) {
    queue<BTNode*> Q;
    if(root == NULL)
        return;
    BTNode* cur = root;
    Q.push(root);
    while(!Q.empty()) {
        //访问队首元素
        cur = Q.front();
        cout<<cur->data<<"\n";
        Q.pop();
        /*将左右孩子入队*/
        if(cur->left != NULL)
            Q.push(cur->left);
        if(cur->right != NULL)
            Q.push(cur->left);
    }
}

标签:遍历,cur,二叉树,push,NULL,root,节点
From: https://www.cnblogs.com/six-years/p/17976726

相关文章

  • 二叉树 - 二叉树入门题
    二叉树入门题1.判断两颗树是否相同classSolution{publicbooleanisSameTree(TreeNodep,TreeNodeq){//如何判断两颗树是否相同?根相同+左右子树相同//如何判断根相同?结构+值相同if(p==null&&q!=null||p!=null&&......
  • 动态规划(4) 完全背包的遍历顺序
    目录377组合总和Ⅳ进阶版爬楼梯322零钱兑换377组合总和ⅣclassSolution{public:intcombinationSum4(vector<int>&nums,inttarget){intn=nums.size();vector<int>dp(target+1,0);dp[0]=1;for(intj=0;j<=target;j++)......
  • 二叉树结构与递归实现前中后序遍历
    1.二叉树结构2.二叉树节点遍历顺序前序:每颗子树以中—》左—》右遍历ABDEHCFG 中序:每颗子树以左 —》中—》右遍历DBEHAFCG 后序:每颗子树以左 —》右—》中遍历DHEBFGCA 代码实现:publicclassBinaryTree{stat......
  • 数组遍历的方法
    1、forEach()forEach() 方法对数组的每个元素执行一次给定的函数,不会改变原数组,没有返回值。数组中的每个值都会调用回调函数,回调函数有三个参数:currentValue:必需。当前元素。index:可选。当前元素的索引值。arr:可选。当前元素所属的数组对象。//forEach不会改......
  • 二叉树的公共祖先
    最开始做的时候,就先想到的是找父节点的那个函数,于是先把目标节点的所以祖先节点存起来,然后一个一个进行比对,当然这样耗时很大。点击查看代码classSolution{public:vector<TreeNode*>vp,vq;TreeNode*findfa(TreeNode*root,TreeNode*k){if(!root){returnNULL;}if(ro......
  • 遍历链表,将节点接到末端 【1月16日学习笔记】
    点击查看代码//遍历链表,将节点接到末端#include<iostream>usingnamespacestd;structnode{ intdata;//数据 node*next;//尾巴};//定义节点结构体node*A;//头指针固定,globalvariabl......
  • 代码随想录 day21 二叉搜索树的最小绝对差 二叉搜索树中的众数 二叉树的最近公共祖先
    二叉搜索树的最小绝对差二叉搜索树就是有序数组那么转换一下就很简单了也可以直接在遍历二叉搜索树的时候进行比较需要一个指针记录前一个节点二叉搜索树中的众数既可以把这题的二叉搜索树当成一般树来做这样就是层序遍历树然后用map记录频率再取频率最高的值这里用......
  • 关于二叉树递归代码的粗鄙理解
    整体来看,二叉树的递归代码,可以分为终止条件,单层递归逻辑。单层递归逻辑就是所谓的根左右那三种,选哪一种也是有讲究的,如果不需要对根节点进行处理,那三种都可以。如果题目侧重与由子节点推到父节点,就采用后序遍历。如果题目侧重与由父节点推到子节点,就采用前序遍历。终止条件怎......
  • 性能篇:List集合遍历元素用哪种方式更快?
    嗨大家好,我是小米!今天给大家分享一篇关于Java集合框架性能的文章,话题是:“如果让你使用for循环以及迭代循环遍历一个ArrayList,你会使用哪种方式呢?原因是什么?LinkedList呢?”废话不多说,让我们直入主题!ArrayList的get元素源码介绍ArrayList,作为Java集合框架中的一个重要类,是基于数组......
  • P1443 马的遍历
    马的遍历题目描述有一个\(n\timesm\)的棋盘,在某个点\((x,y)\)上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。输入格式输入只有一行四个整数,分别为\(n,m,x,y\)。输出格式一个\(n\timesm\)的矩阵,代表马到达某个点最少要走几步(不能到达则输出\(-......