Leetcode(144)-二叉树的前序遍历
给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3 输出: [1,2,3]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
二叉树的前序遍历有递归和非递归两种做法。
在介绍这两种方法之前,我首先介绍下,二叉树如何建立
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x):val(x),left(NULL),right(NULL) {}
};
void createBiTree(TreeNode* &T) //&的意思是传进来节点指针的引用,目的是让传递进来的指针发生改变
{
int c;
cin >> c;
if(-1 == c) //当遇到-1时,令树的根节点为NULL,从而结束该分支的递归
T = NULL;
else
{
T = new TreeNode(0);
T->val=c;
createBiTree(T->left);
createBiTree(T->right);
}
}
(1)递归
思路:用递归的方法,这里用vector作为返回值,需要注意的是,当vector很大时,因为这样存在创建临时对象并拷贝的过程,空间时间开销会很大。一般返回的是引用,但是不能返回临时对象的引用。这里在外面定义了vector,因为如果定义在内部,每次递归都会重新创建一个vector,不符合我们想要的结果。
vector<int> a;
vector<int> preorderTraversal(TreeNode* root)
{
if(root)
{
a.push_back(root->val);//这里每次将本次循环的根节点值放入数组中
preorderTraversal(root->left);
preorderTraversal(root->right);
}
return a;
}
(2)非递归
思路:非递归的形式,也叫作迭代形式。在遍历根节点后还要回来,因此要基于栈(先进后出)来保存节点。
根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下:
对于任一结点P:
1)访问结点P,并将结点P入栈;
2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P;
3)直到P为NULL并且栈为空,则遍历结束。
vector<int> preorderTraversal(TreeNode* root)//非递归实现
{
stack<TreeNode*> s;
TreeNode* p=root;
vector<int> a;
while(p!=NULL || !s.empty())//这里是||,只要P不为空,或者栈里有节点,就要继续
{
while(p)
{
s.push(p);
a.push_back(p->val);
p=p->left;
}
if(!s.empty())
{
p=s.top();
s.pop();
p=p->right;
}
}
return a;
}
Leetcode(144)-二叉树的前序遍历的更多相关文章
- LeetCode 144. 二叉树的前序遍历(Binary Tree Preorder Traversal)
144. 二叉树的前序遍历 144. Binary Tree Preorder Traversal 题目描述 给定一个二叉树,返回它的 前序 遍历. LeetCode144. Binary Tree ...
- Java实现 LeetCode 144 二叉树的前序遍历
144. 二叉树的前序遍历 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] /** * Definition for a ...
- Leetcode 144.二叉树的前序遍历
1.题目描述 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 2.解法 ...
- 【leetcode 144. 二叉树的前序遍历】解题报告
前往二叉树的:前序,中序,后序 遍历算法 方法一:递归 vector<int> res; vector<int> preorderTraversal(TreeNode* roo ...
- LeetCode 144. 二叉树的前序遍历(Binary Tree Preorder Traversal)
题目描述 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路 由 ...
- LeetCode 144. 二叉树的前序遍历 (非递归)
题目链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal/ 给定一个二叉树,返回它的 前序 遍历. /** * Defi ...
- LeetCode 144 ——二叉树的前序遍历
1. 题目 2. 解答 2.1. 递归法 定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么 将当前节点的数值加入到 data 中 递归得到其左子树的数据向量 temp,将 te ...
- LeetCode:二叉树的前序遍历【144】
LeetCode:二叉树的前序遍历[144] 题目描述 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 题目分析 如果用递 ...
- 【LeetCode】144. 二叉树的前序遍历
144. 二叉树的前序遍历 知识点:二叉树:递归:Morris遍历 题目描述 给你二叉树的根节点 root ,返回它节点值的 前序 遍历. 示例 输入:root = [1,null,2,3] 输出:[ ...
随机推荐
- 使用Logback日志
使用Logback日志 spring boot内部使用Logback作为日志实现的框架. Logback和log4j非常相似,如果你对log4j很熟悉,那对logback很快就会得心应手. logba ...
- 虚拟化kvm的搭建
虚拟化, 是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机 ,在一台计算机上同时运行多个逻辑计算机,每台逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不 ...
- JMeter去掉启动的cmd命令窗口和制作快捷方式
1.去掉启动的cmd命令窗口 在使用jmeter时,如果使用默认的jmeter.bat启动的话,会出现一个CMD命令窗口,之后才会启动jmeter工作界面: 如果直接启用ApacheJMeter.ja ...
- TCP 延迟
https://mp.weixin.qq.com/s/fKWJrDNSAZjLsyobolIQKw 直击案发现场!TCP 10倍延迟的真相是? 原创 蛰剑 阿里技术 2019-11-01
- Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」
Compose 简介 | Docker 从入门到实践 https://vuepress.mirror.docker-practice.com/compose/introduction.html Com ...
- maven project builder fails when running on jdk>9
java.lang.NoClassDefFoundError: Could not initialize class org.codehaus.plexus.archiver.jar.JarArchi ...
- Flash 终将谢幕:微软将于年底停止对 Flash 的支持
近日,微软宣布将于今年 12 月终止对 Adobe Flash Player 的支持,届时,微软旗下所有浏览器都将无法使用 Flash,Adobe 也不会在今年 12 月后发布安全更新.早在 2017 ...
- C段错误等调试
本文参考 http://stackoverflow.com/questions/2179403/how-do-you-read-a-segfault-kernel-log-message和http:/ ...
- .NET使用MailKit进行邮件处理
0.介绍 MimeKit and MailKit are popular fully-featured email frameworks for .NET 框架支持版本如下 Supports .NET ...
- Kwp2000协议的应用(硬件原理使用篇)
作者:良知犹存 转载授权以及围观:欢迎添加微信:becom_me 发现K线没有过多的文章描述,作为一个开发过K线的人,不写些文章帮助后来的人岂不是太浪费开发经验了呢. 总述 KWP2000是一 ...