首页 > 编程语言 >【C++】二叉树的前序、中序、后序遍历(递归、非递归)

【C++】二叉树的前序、中序、后序遍历(递归、非递归)

时间:2024-03-06 11:34:28浏览次数:27  
标签:tmp right TreeNode cur 递归 前序 ret 二叉树 push

#include <vector>
#include <iostream>
#include <string>
using namespace std;
//二叉树的定义
struct TreeNode {
  int val;
  TreeNode* left;
  TreeNode* right;
  TreeNode(int a) :val(a), left(NULL), right(NULL) {}
};
//使用递归进行前序遍历
void preoder(TreeNode* cur, std::vector<int>& ret) {
  ret.push_back(cur->val);
  preoder(cur->left, ret);
  preoder(cur->right, ret);
}
//使用递归进行中序遍历
void inoder(TreeNode* cur, std::vector<int>& ret) {
  inoder(cur->left, ret);
  ret.push_back(cur->val);
  inoder(cur->right, ret);
}
//使用递归进行后序遍历
void backoder(TreeNode* cur, std::vector<int>& ret) {
  preoder(cur->left, ret);
  preoder(cur->right, ret);
  ret.push_back(cur->val);
}
//使用栈进行前序遍历
vector<int> preoder1(TreeNode* root) {
  stack<TreeNode*> s;
  vector<int> ret;//存放已经遍历好的数组
  if (!root) {
    return ret;
  }
  s.push(root);
  while (!s.empty()) {
    TreeNode* tmp = s.top();
    s.pop();
    ret.push_back(tmp->val);
    if (tmp->right) {
      s.push(tmp->right);
    }
    if (tmp->left) {
      s.push(tmp->left);
    }
  }
  return ret;
}
//使用栈进行后序遍历
vector<int> postorder(TreeNode* root) {
  vector<int> tmp;
  if (!root) return tmp;
  stack<TreeNode*> s;
  s.push(root);
  while (!s.empty()) {
    TreeNode* node = s.top();
    s.pop();
    tmp.push_back(node->val);
    if (node->left) s.push(node->left);
    if (node->right) s.push(node->right);
  }
  reverse(tmp.rbegin(), tmp.rend());
  return tmp;
}
//使用栈进行中序遍历
vector<int> inorder2(TreeNode* root) {
  vector<int> tmp;
  if (!root) return tmp;
  TreeNode* cur = root;
  stack<TreeNode*> s;
  while (cur || !s.empty()) {
    if (cur) {
      s.push(cur);
      cur = cur->left;
    }
    else {
      cur = s.top();
      s.pop();
      tmp.push_back(cur->val);
      cur = cur->right;
    }
  }
  return tmp;
}

 

标签:tmp,right,TreeNode,cur,递归,前序,ret,二叉树,push
From: https://www.cnblogs.com/smartlearn/p/18056156

相关文章

  • 【C++】求二叉树的最大深度和最小深度
    //求一颗二叉树的最大深度求高度:后序遍历求深度:前序遍历intmaxDepth(TreeNode*root){returnroot?1+max(maxDepth(root->left),maxDepth(root->right)):0;}//求一颗二叉树的最小深度(实质上是后序遍历)intminDepth(TreeNode*root){if(!root)retur......
  • 【C++】翻转二叉树(递归、非递归)
    //使用递归翻转二叉树TreeNode*reverseTree(TreeNode*root){if(!root)returnroot;swap(root->left,root->right);reverseTree(root->left);reverseTree(root->right);returnroot;}//使用队列翻转二叉树层序遍历TreeNode*invertTree(TreeNode*root)......
  • 代码随想录算法训练营第三十七天 | 738. 单调递增的数字,968.监控二叉树
    968.监控二叉树 已解答困难 相关标签相关企业 给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。 示例1:输入:[0,0,null,0,0]输出:1......
  • 257. 二叉树的所有路径c
    很好的题目,让我的sprintf旋转/***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*//***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*......
  • 110. 平衡二叉树c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/intmax(inti,intj){if(i>j)returni;returnj;}intheight(structTreeNode*root){......
  • 代码随想录算法训练营第三十六天| ● 738.单调递增的数字 ● 968.监控二叉树 ● 总
    单调递增的数字 题目链接:738.单调递增的数字-力扣(LeetCode)思路:从左向右验证是否按位单调递增,如果出现递减的区间,则从该位开始验证该位减1后是否比左边的相邻位大,如果不符合就接着向左寻找这样的位,如果找到了,则将该位前面的位复制到结果中,该位减1加入结果,该位之后的位全部改......
  • 111. 二叉树的最小深度c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/intmin(inti,intj){if(i<j)returni;returnj;}intminDepth(structTreeNode*root){......
  • 222. 完全二叉树的节点个数c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/intcountNodes(structTreeNode*root){if(!root)return0;if(!root->left&&!root->......
  • 226. 翻转二叉树 c
    层次遍历的题目C写吐血了,缓一缓再写那种气死人的题目。/***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/voidreverseroot(structTreeNode*root){if(!root)......
  • mysql根据父节点递归查询所有子节点
    SELECTt3.*FROM(SELECTt1.*,IF(FIND_IN_SET(parent_id,@pids)>0,@pids:=CONCAT(@pids,',',id),'0')ASischildFROM(SELECTt.id,t.parent_id,t.NAMEFROMt_parentAStORDERBYt.idASC)t1,......