[LintCode] 二叉树的前序遍历
The recursive solution is trivial and I omit it here.
Iterative Solution using Stack (O(n) time and O(n) space):
- /**
- * Definition of TreeNode:
- * class TreeNode {
- * public:
- * int val;
- * TreeNode *left, *right;
- * TreeNode(int val) {
- * this->val = val;
- * this->left = this->right = NULL;
- * }
- * }
- */
- class Solution {
- public:
- /**
- * @param root: The root of binary tree.
- * @return: Preorder in vector which contains node values.
- */
- vector<int> preorderTraversal(TreeNode *root) {
- // write your code here
- vector<int> nodes;
- TreeNode* node = root;
- stack<TreeNode*> right;
- while (node || !right.empty()) {
- if (node) {
- nodes.push_back(node -> val);
- if (node -> right)
- right.push(node -> right);
- node = node -> left;
- }
- else {
- node = right.top();
- right.pop();
- }
- }
- return nodes;
- }
- };
Another more sophisticated solution using Morris Traversal (O(n) time and O(1) space):
- /**
- * Definition of TreeNode:
- * class TreeNode {
- * public:
- * int val;
- * TreeNode *left, *right;
- * TreeNode(int val) {
- * this->val = val;
- * this->left = this->right = NULL;
- * }
- * }
- */
- class Solution {
- public:
- /**
- * @param root: The root of binary tree.
- * @return: Preorder in vector which contains node values.
- */
- vector<int> preorderTraversal(TreeNode *root) {
- // write your code here
- vector<int> nodes;
- TreeNode* node = root;
- while (node) {
- if (node -> left) {
- TreeNode* predecessor = node -> left;
- while (predecessor -> right && predecessor -> right != node)
- predecessor = predecessor -> right;
- if (!(predecessor -> right)) {
- nodes.push_back(node -> val);
- predecessor -> right = node;
- node = node -> left;
- }
- else {
- predecessor -> right = NULL;
- node = node -> right;
- }
- }
- else {
- nodes.push_back(node -> val);
- node = node -> right;
- }
- }
- return nodes;
- }
- };
[LintCode] 二叉树的前序遍历的更多相关文章
- lintcode :Binary Tree Preorder Traversal 二叉树的前序遍历
题目: 二叉树的前序遍历 给出一棵二叉树,返回其节点值的前序遍历. 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返回 [1,2,3]. 挑战 你能使用非递归实现么? 解题: 通过递 ...
- 【C++】根据二叉树的前序遍历和中序遍历重建二叉树并输出后续遍历
/* 现在有一个问题,已知二叉树的前序遍历和中序遍历: PreOrder:GDAFEMHZ InOrder:ADEFGHMZ 我们如何还原这颗二叉树,并求出他的后序遍历 我们基于一个事实:中序遍历一定 ...
- LeetCode:144_Binary Tree Preorder Traversal | 二叉树的前序遍历 | Medium
题目:Binary Tree Preorder Traversal 二叉树的前序遍历,同样使用栈来解,代码如下: struct TreeNode { int val; TreeNode* left; ...
- 【LeetCode题解】144_二叉树的前序遍历
目录 [LeetCode题解]144_二叉树的前序遍历 描述 方法一:递归 Java 代码 Python 代码 方法二:非递归(使用栈) Java 代码 Python 代码 [LeetCode题解]1 ...
- LintCode-66.二叉树的前序遍历
二叉树的前序遍历 给出一棵二叉树,返回其节点值的前序遍历. 样例 给出一棵二叉树 {1,#,2,3}, 返回 [1,2,3]. 挑战 你能使用非递归实现么? 标签 递归 二叉树 二叉树遍历 非递归 c ...
- LeetCode:二叉树的前序遍历【144】
LeetCode:二叉树的前序遍历[144] 题目描述 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 题目分析 如果用递 ...
- 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历
二叉树的先序,中序,后序如何遍历,不在此多说了.直接看题目描述吧(题目摘自九度oj剑指offer面试题6): 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结 ...
- LeetCode 144. 二叉树的前序遍历(Binary Tree Preorder Traversal)
144. 二叉树的前序遍历 144. Binary Tree Preorder Traversal 题目描述 给定一个二叉树,返回它的 前序 遍历. LeetCode144. Binary Tree ...
- leecode刷题(28)-- 二叉树的前序遍历
leecode刷题(28)-- 二叉树的前序遍历 二叉树的前序遍历 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 思路 ...
随机推荐
- Current thread must be set to single thread apartment (STA) mode before OLE,当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2”。
Add the STAThreadAttribute attribute on the Main method. This attribute is required if your program ...
- 在同一台服务器上启动多个 FreeSWITCH 实例
有时候,需要用到多个FreeSWITCH进行测试,或者需要在一台服务器上部署多个“不兼容”的系统.我们在这一节探讨一下怎么做. 背景故事 几年前我还在Idapted工作的时候,由于需要连接Skype及 ...
- log4cxx在linux下的编译使用
最近在linux下使用log4cxx库,按照其官方文档提供的方法来进行编译,不能成功,又利用google搜索了好几个中文博客上讲述在linux下编译使用log4cxx库的方法,依然不能成功,在这里我奉 ...
- win 7 下vim的使用
1.gVim74.exe ftp://ftp.vim.org/pub/vim/pc/gvim74.exe 2.vimcdoc-1.9.0-setup.exe 中文说明文档 http://211.147 ...
- ML中Boosting和Bagging的比較
说到ML中Boosting和Bagging,他们属于的是ML中的集成学习,集成学习法(Ensemble Learning) ① 将多个分类方法聚集在一起.以提高分类的准确率. (这些算法能够是不同的 ...
- Redis 5种数据类型,2种特殊数据处理策略
5种数据类型 String [html] view plaincopy 1.String 经常使用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操 ...
- 如何启动mininet实例上的wireshark图形界面
启动wireshark 要启动mininet实例上的wireshark的图形界面,其实关键点只有两个: 保证宿主机上安装了X11 使用ssh -Y mininet@192.168.56.102 登录进 ...
- vivado编译出错 [Synth 8-729] [Synth 8-787]
http://www.cnblogs.com/pejoicen 打开vivado工程后,发现右上角如下图所示: 重新编译这两个ip核后,对整个工程synthesis,工程报错 [Synth 8-7 ...
- 聊一聊Android的消息机制
聊一聊Android的消息机制 侯 亮 1概述 在Android平台上,主要用到两种通信机制,即Binder机制和消息机制,前者用于跨进程通信,后者用于进程内部通信. 从技术实现上来说,消息机制还是比 ...
- 170. Rotate List【medium】
Given a list, rotate the list to the right by k places, where k is non-negative. Example Given 1-& ...