首页 > 其他分享 >前中后序遍历以及层序遍历

前中后序遍历以及层序遍历

时间:2023-04-27 22:57:30浏览次数:45  
标签:right TreeNode val 前中 层序 nullptr int 遍历 left

  • 前言
    • 非递归算法中,前中后序遍历需要借助栈,层序遍历需要借助队列
    • 前中后序遍历的递归算法中,语法大致相同,只是执行顺序不同,注意

前序遍历

方法一:递归算法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */

class Solution {
public:
    vector<int>ans;
    vector<int> preorderTraversal(TreeNode* root) {
        
        preOrder(root);
        return ans;
    }
    void preOrder(TreeNode* t){
         if(!t)
            return;
        ans.push_back(t->val);
        preorderTraversal(t->left);
        preorderTraversal(t->right);
    }
};

方法二:非递归算法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        TreeNode*p=root;
        stack<TreeNode*>st;
        vector<int>ans;
        while(p!=NULL || !st.empty()){
            while(p!=NULL){
                ans.push_back(p->val);
                st.push(p);
                p=p->left;
            }
            p=st.top()->right;
            st.pop();
        }
        return ans;
    }
};

中序遍历

方法一:递归算法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int>ans;

    void inOrder(TreeNode*root){
        if(root==NULL)
            return;
        inOrder(root->left);
        ans.push_back(root->val);
        inOrder(root->right);
    }

    vector<int> inorderTraversal(TreeNode* root) {
        inOrder(root);
        return ans;

    }
};

方法二:非递归算法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int>ans;
        stack<TreeNode*>st;
        TreeNode*p=root;
        while(p!=NULL || !st.empty()){
            while(p!=NULL){
               st.push(p);
               p=p->left; 
            }
            ans.push_back(st.top()->val);
            p=st.top()->right;
            st.pop();
        }
        return ans;
    }
};

后序遍历

方法一:递归算法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int>ans;
    vector<int> postorderTraversal(TreeNode* root) {
        postOrder(root);
        return ans;
    }
    void postOrder(TreeNode*p){
        if(!p)
            return;
        postOrder(p->left);
        postOrder(p->right);
        ans.push_back(p->val);
    }
};

方法二:非递归算法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*>st;
        TreeNode*p=root;
        TreeNode*pre=NULL;//标记刚刚被访问过的元素
        vector<int>ans;
        while(p!=NULL || !st.empty()){
            while(p!=NULL){
                st.push(p);
                p=p->left;
            }   
            //栈顶元素右孩子为空或者已经访问过栈顶元素的右孩子,则访问栈顶元素
            if(st.top()->right==NULL || pre==st.top()->right){
                ans.push_back(st.top()->val);
                pre=st.top();
                st.pop();
            }
            //当栈顶元素有右孩子企鹅没有被访问过,就访问栈顶元素的右孩子
            else
                p=st.top()->right;
        }
        return ans;
    }
};

层序遍历

标签:right,TreeNode,val,前中,层序,nullptr,int,遍历,left
From: https://www.cnblogs.com/cxyupup/p/17360465.html

相关文章

  • ABAP 遍历内表数据的时候,加上前端筛选条件
    1.前端查询条件*----------------------------------------------------------------------**选择屏幕*----------------------------------------------------------------------*SELECTION-SCREENBEGINOFBLOCKb1WITHFRAMETITLETEXT-001.SELECT-OPTIONS:"PARA......
  • js遍历对象属性
    1、遍历要给json对象varjsObj={"name":"張三","age":18}for(varkeyinjsObj){console.log("key:"+key+",val:"+jsObj[key])}2、遍历数组vararr=newArray();arr.push(11);arr.push(22);arr.push(33);arr.forEach(i......
  • c++遍历搜索关键字
    #include<iostream>#include<windows.h>#include<string.h>#include<strsafe.h>#defineMAX_INPUT_LENGTH255usingnamespacestd;voidprintMemory(char*location,longsize){ printf("\n\n---------------------location......
  • 二叉树的遍历(递归算法)
    //二叉树的遍历(递归算法)#include<stdio.h>#include<malloc.h>typedefstructBiTNode{intdata;structBiTNode*lchild,*rchild;//存储二叉树的左孩子和右孩子}BiTNode,*BiTree;voidInitTree(BiTree&root){root=(BiTNode*)malloc(sizeof(BiTNo......
  • 如何遍历HashMap集合?
    在Java中,HashMap是一种常用的数据结构,它提供了快速的查找、插入和删除操作。当我们需要遍历HashMap中的所有元素时,可以利用三种不同的方法实现。方法一:使用键值对遍历HashMap中存储的是键值对的形式,因此最简单的方法就是直接遍历键值对。我们可以通过以下代码实现://创建一个Ha......
  • php递归遍历文件目录
    美日汇:www.hnzyxok.com手机端:www.hnzyxok.com/i递归遍历文件目录(大体的思路就是:传入一个文件名后输出遍历所有内容,等发现文件还是个文件夹的时候接着递归调用当前的遍历方法,如果不是文件夹就输出文件名)functiondakai($mulu){$mydir=dir($mulu);echo"<ul>\n";while($file......
  • ArrayList的遍历方式与fail-fast
    遍历方式普通for循环遍历for(inti=0;i<arrayList.size();i++){System.out.println(arrayList.get(i));}推荐使用普通for循环,效率最高。Iterator迭代Iterator<Integer>iterator=arrayList.iterator();while(iterator.hasNext()){System.out.println(itera......
  • 剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)
    (剑指Offer33.二叉搜索树的后序遍历序列(java解题))1.题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:5/\26/\13示......
  • 剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)
    目录1.题目2.解题思路3.数据类型功能函数总结4.java代码5.踩坑小记递归调用,显示StackOverflowError1.题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉......
  • Java中ArrayList的遍历与删除元素方式总结
    在Java编程中,我们经常需要对数据结构进行遍历操作,并根据业务需求删除部分元素。而数组列表(ArrayList)是集合类中的一种,它可以动态地添加和删除元素,非常适合在程序中使用。本篇博客将总结ArrayList中的两种遍历和删除元素的方式。在下面的示例代码中,我们先定义了一个ArrayList对象,......