面试:C++二叉树遍历(递归/非递归)
- #include <vector>
- #include <stack>
- #include <queue>
- using namespace std;
- struct TreeNode{
- int val;
- TreeNode* left;
- TreeNode* right;
- TreeNode(int x):val(x),left(nullptr),right(nullptr){};
- };
- void preOrder(TreeNode* root,vector<int>& res){
- if(root == nullptr) return;
- res.push_back(root->val);
- preOrder(root->left,res);
- preOrder(root->right,res);
- }
- void inOrder(TreeNode* root,vector<int>& res){
- if(root == nullptr) return;
- inOrder(root->left,res);
- res.push_back(root->val);
- inOrder(root->right,res);
- }
- void postOrder(TreeNode* root,vector<int>& res){
- if(root == nullptr) return;
- postOrder(root->left,res);
- postOrder(root->right,res);
- res.push_back(root->val);
- }
- vector<int> preOrder(TreeNode* root){
- vector<int> res;
- if(root == nullptr) return res;
- stack<TreeNode*> st;
- TreeNode* cur = root;
- while(cur || !st.empty()){
- while(cur){
- res.push_back(cur->val);
- st.push(cur);
- cur = cur->left;
- }
- if(!st.empty()){
- cur = st.top();
- st.pop();
- cur = cur->right;
- }
- }
- return res;
- }
- vector<int> inOrder(TreeNode* root){
- vector<int> res;
- if(root==nullptr) return res;
- stack<TreeNode*> st;
- TreeNode* cur = root;
- while(cur || !st.empty()){
- while(cur){
- st.push(cur);
- cur = cur->left;
- }
- if(!st.empty()){
- cur = st.top();
- st.pop();
- res.push_back(cur->val);
- cur = cur->right;
- }
- }
- return res;
- }
- vector<int> postOrder(TreeNode* root){
- vector<int> res;
- if(root == nullptr) return res;
- stack<TreeNode*> st;
- TreeNode* cur = root;
- while(cur){
- st.push(cur);
- cur = cur->left;
- }
- TreeNode* lastVisited = nullptr;
- while(!st.empty()){
- cur = st.top();
- st.pop();
- if(cur->right == nullptr || cur->right == lastVisited){
- res.push_back(cur->val);
- lastVisited = cur;
- }else{
- st.push(cur);
- cur = cur->right;
- while(cur){
- st.push(cur);
- cur = cur->left;
- }
- }
- }
- return res;
- }
- vector<int> levelOrder(TreeNode* root){
- vector<int> res;
- if(root == nullptr) return res;
- queue<TreeNode*> q;
- q.push(root);
- while(!q.empty()){
- size_t n = q.size();
- for(size_t i=;i<n;i++){
- TreeNode* cur = q.back();
- q.pop();
- res.push_back(cur->val);
- if(cur->left) q.push(cur->left);
- if(cur->right) q.push(cur->right);
- }
- }
- return res;
- }
面试:C++二叉树遍历(递归/非递归)的更多相关文章
- java数据结构之二叉树遍历的非递归实现
算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...
- 二叉树遍历(非递归版)——python
二叉树的遍历分为广度优先遍历和深度优先遍历 广度优先遍历(breadth first traversal):又称层次遍历,从树的根节点(root)开始,从上到下从从左到右遍历整个树的节点. 深度优先遍 ...
- c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)
二叉树的创建与遍历(非递归遍历左右中,破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...
- 二叉树的递归,非递归遍历(C++)
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...
- 递归/非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)
递归代码:递归实现很简单 '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...
- c/c++叉树的创建与遍历(非递归遍历左右中,不破坏树结构)
二叉树的创建与遍历(非递归遍历左右中,不破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...
- 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)
一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...
- Reverse Linked List 递归非递归实现
单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...
- 二叉树的先序、中序以及后序遍历(递归 && 非递归)
树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...
- 二叉树——遍历篇(递归/非递归,C++)
二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...
随机推荐
- 网络编程socket、udp
PS:主机字节顺序,个位在低字节上 计算机本身不能通讯,使通过在同一主机或者不同主机内的软件进行数据传输. 套接字socket:套接字socket可以参照文件指针来理解,文件指针是表示对文件打开进行某 ...
- Java理论学时第四节。课后作业。
请查看String.equals()方法的实现代码,注意学习其实现方法. public class StringEquals { public static void main(String[] ar ...
- 杭电2133What day is it
给你个日期 问是星期几 知道1 1 1是周1就行了 #include <iostream>#include <cstdio>using namespace std ...
- Linux vi 文本代码时显示行号或不显示行号
Linux vi 文本代码时显示行号或不显示行号 前提 安装了vim $vi ~/.vimrc 显示的话加上 set nu 不想显示的话可以注释掉 "set nu 之后 $source ~ ...
- AngularJS ngTemplate寄宿方式 模板缓存 $templateCache
AngularJS的指令中经常定义模板(template或templateUrl),可以选择将Html模板直接寄宿在WEB容器中,如Tomcat.IIS.Nginx.NodeJs Express,也可 ...
- jacoco初探
# 背景 集团的代码覆盖率平台因为网络问题无法使用,只能自己研究下. 覆盖率是衡量自动化用例效果产品的一个指标,但只是一个辅助指标,覆盖率高并不意味着质量好,但覆盖率低却能说明一些问题, # 对比 覆 ...
- 设置 Nuget 本地源、在线私有源、自动构建打包
设置 Nuget 本地源.在线私有源.自动构建打包 本文演示如果在项目中生成 Nuget 包,并添加 Nuget 本地源,不用发布到 Nuget 服务器.再附带使用在线私有源的简单方法,以及提交代码自 ...
- [机翻] WIRER ON THE WIRE - SIGNALR协议的非正式描述
原文 原文很简单,以下为机翻 WIRER ON THE WIRE - SIGNALR协议的非正式描述 我已经看到询问有关SignalR协议的描述的问题出现了很多.哎呀,当我开始关注SignalR时,我 ...
- ModelValidator基于元数据的验证
ModelValidator主要是应用在ModelMetadata元数据的类型上或类型属性上.它是验证的基础类型,所有的ModelValidatorProviders.DataAnnotationVa ...
- Redis---quickList(快速列表)
1. 概述 考虑到链表的附加空间相对太高,prev 和 next 指针就要占去 16 个字节 (64bit 系统的指针是 8 个字节),另外每个节点的内存都是单独分配,会加剧内存的碎片化,影响内存管理 ...