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

二叉树的迭代遍历

时间:2024-03-15 21:58:59浏览次数:22  
标签:Node 遍历 迭代 res stk right 二叉树 push left

二叉树前后序遍历(迭代)

#include <bits/stdc++.h>
using  namespace  std;
struct Node {
    int data;
    Node* left;
    Node* right;
    Node(int value=0):data(value),left(nullptr),right(nullptr){}
};
Node *insertEle();
void preorder(Node *pNode);
void midorder(Node* p);
void postorder(Node* p);
int main() {
    Node* root = insertEle();
    cout << "Inorder traversal of the tree is: ";
    preorder(root);
    cout << endl;
    postorder(root);
    return 0;
}
void postorder(Node* p){
    cout<<"Post order is :";
    stack<Node*> stk;
    vector<int> res;
    stk.push(p);
    while (!stk.empty()){
        Node* ele=stk.top();
        stk.pop();
        if(ele){
            res.push_back(ele->data);
            stk.push(ele->left);
            stk.push(ele->right);
        }
    }
    std::reverse(res.begin(), res.end());
    for(const auto& item:res){
        cout << item << " ";
    }
    cout << endl;
}
void  preorder(Node *pNode) {
    stack<Node*> stk;
    vector<int> res;
    stk.push(pNode);
    while (!stk.empty()){
        Node* p = stk.top();
        stk.pop();
        if(p){
            res.push_back(p->data);
            stk.push(p->right);
            stk.push(p->left);
        }
    }

    for(const auto& item:res){
        cout << item << " ";
    }
    cout << endl;
}

Node *insertEle() {
    Node* root = new Node(5);
    root->left = new Node(4);
    root->right = new Node(6);
    root->left->left = new Node(2);
    root->left->right = new Node(1);
    return root;
}

void midorder(Node* p){
    cout<<"----------------------------------------------------------------------"<<endl;
    cout<<"mid order is :";
    stack<Node*> stk;
    vector<int> res;

    Node* cur=p;
    while (!stk.empty()||cur){
        if(cur){
            stk.push(cur);

            cur=cur->left;
        }
        if(!cur){
            Node* ptr = stk.top();
            stk.pop();
            res.push_back(ptr->data);
            cur=ptr->right;
        }
    }
    for(const auto& item:res){
        cout << item << " ";
    }
    cout << endl;
}

原来的迭代法的前序遍历,是中左右,然后把

stk.push(p->right);
stk.push(p->left);//从栈里面出来的就是中左右

颠倒顺序

stk.push(p->left);
stk.push(p->right);//从栈里面出来的就是中右左

接着我直接reverse这个vector,就是左右中,直接得到后序遍历

中序的逻辑就是一直往左走,到底了,打印“中”(左中右里面的“中”),然后去右(right)部分里面

具体代码讲解!!!

【写出二叉树的非递归遍历很难么?这次让你不再害怕非递归!|二叉树的非递归遍历 | 二叉树的遍历迭代法 | 前序与中序】 【精准空降到 00:01】 https://www.bilibili.com/video/BV15f4y1W7i2/?share_source=copy_web&vd_source=afbacdc02063c57e7a2ef256a4db9d2a&t=1

【写出二叉树的非递归遍历很难么?这次再带你写出中序遍历的迭代法!|二叉树的非递归遍历 | 二叉树的遍历迭代法】 【精准空降到 00:05】 https://www.bilibili.com/video/BV1Zf4y1a77g/?share_source=copy_web&vd_source=afbacdc02063c57e7a2ef256a4db9d2a&t=5

层序遍历简单

void layerorder(Node* p){
    queue<Node*> q;
    cout<<"Layer order is :";
    q.push(p);
    while (!q.empty()){
        Node* ptr=q.front();
        q.pop();
        if(ptr){
            cout<<ptr->data<<" ";
            q.push(ptr->left);
            q.push(ptr->right);
        }
    }
    cout<<endl;
}

标签:Node,遍历,迭代,res,stk,right,二叉树,push,left
From: https://blog.csdn.net/weixin_46028606/article/details/136662502

相关文章

  • 代码随想录 第21天 | ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ●
    leetcode:530.二叉搜索树的最小绝对差-力扣(LeetCode)思路:判断最小绝对差,肯定用中序遍历,双指针一前一后依次判断。classSolution{intresult=Integer.MAX_VALUE;TreeNodepre=null;publicintgetMinimumDifference(TreeNoderoot){if(root==......
  • 【leetcode】二叉树的前序遍历➕中序遍历➕后序遍历
    大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞......
  • 力扣刷题Days19-637.二叉树的层平均数
    目录1,题目2,代码2.1广度优先遍历2.2深度优先遍历3,学习与总结1,题目给定一个非空二叉树的根节点 root ,以数组的形式返回每一层节点的平均值。2,代码2.1广度优先遍历/***Definitionforabinarytreenode.*functionTreeNode(val,left,right){*......
  • 洛谷题单指南-二叉树-P1030 [NOIP2001 普及组] 求先序排列
    原题链接:https://www.luogu.com.cn/problem/P1030题意解读:已知中序、后序,求先序。解题思路:与洛谷题单指南-二叉树-P1827[USACO3.4]美国血统AmericanHeritage非常类似,不在介绍过程,直接给出代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;stringin,post......
  • 二叉树的垂序遍历
    说在前面......
  • 数据结构之链式二叉树
    当我们初步了解二叉树后我们就可以进一步去深入学习二叉树了1.链式二叉树的遍历这里我们先去定义链式二叉树的结构分为两个指针一左一右他们分别指向左子树和右子树typedefintBTDataType;typedefstructBinaryTreeNode{ BTDataTypedata; structBinartTreeNode......
  • 21_迭代器模式
    迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不需要暴露集合对象的内部结构。迭代器模式将遍历操作封装在迭代器对象中,使得客户端可以通过迭代器对象依次访问集合中的元素。迭代器模式有三个主要角色:迭代器(Iterator):定义了访问和遍历集合对......
  • 代码随想录算法训练营第day17|110.平衡二叉树 、 257. 二叉树的所有路径 、404.左叶子
    目录a.110.平衡二叉树b.257.二叉树的所有路径 c.404.左叶子之和a.110.平衡二叉树力扣题目链接(opensnewwindow)给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。示例1......
  • 洛谷 P5018 对称二叉树
    题目背景NOIP2018普及组T4题目描述一棵有点权的有根树如果满足以下条件,则被轩轩称为对称二叉树:二叉树;将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等。下图中节点内的数字为权值,节点外的 idid 表示节点编号。现在给出一棵二叉树,希望你找出......
  • P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值
    题目描述给定一棵包含N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是​,如下图所示: 现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。注:根的深度是 1......