C++实现二叉树非递归遍历方法实例总结_C 语言

一般来说,二叉树的遍历是C++程序员在面试中经常考察的,其实前中后三种顺序的遍历都大同小异,自己模拟两个栈用笔画画是不难写出代码的。现举一个非递归遍历的方法如下,供大家参考。

具体代码如下:

class Solution {
public:
  vector<int> preorderTraversal(TreeNode *root) {
    vector<int> out;
    stack<TreeNode*> s;
    s.push(root);
    while(!s.empty() && root){
      TreeNode *node = s.top();
      out.push_back(node->val);
      s.pop();
      if(node->right) s.push(node->right);
      if(node->left) s.push(node->left);
    }
    return out;
  }
  vector<int> inorderTraversal(TreeNode *root) {
    stack<TreeNode *> s;
    vector<int> out;
    TreeNode *node = root;
    bool done = false;
    while(!done){
      if(node){
        s.push(node);
        node = node->left;
      }else {
        if(s.empty()) done = true;
        else{
          node = s.top();
          s.pop();
          out.push_back(node->val);
          node = node->right;
        }
      }
    }
    return out;
  }
  vector<int> postorderTraversal(TreeNode *root) {
    vector<int> out;
    stack<TreeNode*> s;
    TreeNode* node = root;
    s.push(node);
    while(!s.empty()&&node){
      node = s.top();
      out.push_back(node->val);
      s.pop();
      if(node->left) s.push(node->left);
      if(node->right)s.push(node->right);
    }
    reverse(out.begin(),out.end());
    return out;
  }
};

希望本文所述对大家的C++算法学习有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 遍历
, 二叉树
, 方法
非递归
非递归遍历二叉树、二叉树非递归遍历算法、非递归后序遍历二叉树、二叉树的非递归遍历、非递归中序遍历二叉树,以便于您获取更多的相关知识。

时间: 2024-08-03 19:25:35

C++实现二叉树非递归遍历方法实例总结_C 语言的相关文章

求大神看看,C语言二叉树非递归遍历问题 ,最后输出正确,然后在程序崩溃

问题描述 求大神看看,C语言二叉树非递归遍历问题 ,最后输出正确,然后在程序崩溃 #include #include #include typedef struct TNode { char date; struct TNode *lchild,*rchild; }TNode,*BiTree; typedef struct { BiTree top; BiTree *base; int stacksize; }Stack; int createBiTree(BiTree &S){ char ch

C语言二叉树非递归遍历问题

问题描述 C语言二叉树非递归遍历问题 #include"stdio.h" #include"stdlib.h" #define OK 1 #define ERROR 0 #define OVERFLOW -1 typedef char TElemType; typedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; typedef int Stat

C语言函数的递归和调用实例分析_C 语言

一.基本内容: C语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己. 要点: 1.C语言函数可以递归调用. 2.可以通过直接或间接两种方式调用.目前只讨论直接递归调用. 二.递归条件 采用递归方法来解决问题,必须符合以下三个条件: 1.可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减. 说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适用递归调用. 2

采用栈数据结构的二叉树非递归遍历

[前言]树的遍历,根据访问自身和其子节点之间的顺序关系,分为前序,后序遍历.对于二叉树,每个节点至多有两个子节点(特别的称为左,右子节点),又有中序遍历.由于树自身具有的递归性,这些遍历函数使用递归函数很容易实现,代码也非常简洁.借助于数据结构中的栈,可以把树遍历的递归函数改写为非递归函数.   在这里我思考的问题是,很显然,循环可以改写为递归函数.递归函数是否借助栈这种数据结构改写为循环呢.因为函数调用中,call procedure stack 中存储了流程的 context,调用和返回相当

C++中COM组件初始化方法实例分析_C 语言

本文实例讲述了C++中COM组件初始化方法.分享给大家供大家参考.具体如下: 这里使用BCB 在使用TADOConnect等组件时需要进行初始化 调用接口 : CoInitialize(NULL);//初始化COM套件 CoUninitialize();//释放COM套件 在DLL入口中调用: static bool isCoInitialize = false; //是否是自己进行的初始化 int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned l

如何使用递归和非递归方式反转单向链表_C 语言

问题:给一个单向链表,把它从头到尾反转过来.比如: a -> b -> c ->d 反过来就是 d -> c -> b -> a . 分析:假设每一个node的结构是: 复制代码 代码如下: class Node { char value; Node next;} 因为在对链表进行反转的时候,需要更新每一个node的"next"值,但是,在更新 next 的值前,我们需要保存 next 的值,否则我们无法继续.所以,我们需要两个指针分别指向前一个节点

C++常用字符串分割方法实例汇总_C 语言

本文实例汇总了C++常用字符串分割方法,分享给大家供大家参考.具体分析如下: 我们在编程的时候经常会碰到字符串分割的问题,这里总结下,也方便我们以后查询使用. 一.用strtok函数进行字符串分割 原型: char *strtok(char *str, const char *delim); 功能:分解字符串为一组字符串. 参数说明:str为要分解的字符串,delim为分隔符字符串. 返回值:从str开头开始的一个个被分割的串.当没有被分割的串时则返回NULL. 其它:strtok函数线程不安全

C++设计类不能被继承的方法实例讲解_C 语言

首先想到的是在C++中,子类的构造函数会自动调用父类的构造函数.同样,子类的析构函数也会自动调用父类的析构函数.要想一个类不能被继承,只要把它的构造函数和析构函数都定义为私有函数.那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数.析构函数而导致编译错误. 可是这个类的构造函数和析构函数都是私有函数了,怎样才能得到该类的实例呢?可以通过定义静态来创建和释放类的实例.基于这个思路,可以写出如下的代码: 复制代码 代码如下: ////////////////////////////////

C语言二叉树的非递归遍历实例分析_C 语言

本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { if(!p) return; stack<Node*> s; Node *t; s.push(p); while(!s.empty()) { t=s.top(); printf("%d\n",t->data); s.pop(); if(t->right) s.pus