Given a binary tree, return the preorder traversal of its nodes' values.

For example:

Given binary tree {1,#,2,3},

   1
\
2
/
3

return [1,2,3].

Note: Recursive solution is trivial, could you do it iteratively?

算法一,栈

前序遍历。

1.訪问根结点

2.訪问左子树

3.訪问右子树

题目要求不使用递归。

此处使用栈实现。

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
if (!root)
return ans;
stack<TreeNode *> s;
s.push(root);
while (!s.empty()) {
root = s.top();
s.pop();
ans.push_back(root->val);
if (root->right)
s.push(root->right);
if (root->left)
s.push(root->left);
}
return ans;
}
};

算法二,栈保存右子树结点。

和上面差别是,此处用栈仅仅保留右孩子结点。

算法一。事实上左孩子循环结束时刚刚入栈了,下次循环開始时,立刻又会出栈。

在此实现中。则直接用一变量保存左孩子。不必进栈出栈。

class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode *> rights;
while (root || !rights.empty()) {
if (root) {
ans.push_back(root->val);
rights.push(root->right);
root = root->left;
}
else {
root = rights.top();
rights.pop();
}
}
return ans;
}
};

算法三,线索遍历

不再使用栈。而使用节点中空暇的右指针。让其指向根结点。

訪问一个左子树之前。先找到其左子树最右下的孩子,让其右指针指向根结点。

以便在訪问完左子树后。能返回根结点。从而找到根结点的右子树。

即訪问左子树之前,须要先建立返回的线索。

要注意的是。在建立线索的情况下,在訪问一个结点时,假设其左子树不空。

则此时,包括两种情况:

1. 此结点未訪问过。

2. 此结点已经訪问过。即訪问完左孩子,刚延着线索返回来。

怎样区分上面两种情况。就是看左子树的返回线索是否已经建立。

class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
while (root) {
if (!root->left) {
ans.push_back(root->val);
root = root->right;
}
else {
TreeNode *runner = root->left;
while (runner->right && runner->right != root)
runner = runner->right; if (!runner->right) {
ans.push_back(root->val);
runner->right = root;
root = root->left;
}
else {
runner->right = NULL;
root = root->right;
}
}
}
return ans;
}
};

Binary Tree Preorder Traversal -- leetcode的更多相关文章

  1. Binary Tree Preorder Traversal —— LeetCode

    Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...

  2. Binary Tree Preorder Traversal leetcode java

    题目: Given a binary tree, return the preorder traversal of its nodes' values. For example: Given bina ...

  3. Binary Tree Preorder Traversal -- LEETCODE 144

    方法一:(迭代) class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<in ...

  4. C++版 - LeetCode 144. Binary Tree Preorder Traversal (二叉树先根序遍历,非递归)

    144. Binary Tree Preorder Traversal Difficulty: Medium Given a binary tree, return the preorder trav ...

  5. LeetCode 144. 二叉树的前序遍历(Binary Tree Preorder Traversal)

    144. 二叉树的前序遍历 144. Binary Tree Preorder Traversal 题目描述 给定一个二叉树,返回它的 前序 遍历. LeetCode144. Binary Tree ...

  6. 【LeetCode】Binary Tree Preorder Traversal

    Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' valu ...

  7. Binary Tree Preorder Traversal on LeetCode in Java

    二叉树的非递归前序遍历,大抵是很多人信手拈来.不屑一顾的题目罢.然而因为本人记性不好.基础太差的缘故,做这道题的时候居然自己琢磨出了一种解法,虽然谈不上创新,但简单一搜也未发现雷同,权且记录,希望于人 ...

  8. 【LeetCode】144. Binary Tree Preorder Traversal (3 solutions)

    Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' valu ...

  9. LeetCode: Binary Tree Preorder Traversal 解题报告

    Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' valu ...

随机推荐

  1. artdialog自定义多个按钮

    在实际运用到的过程中artdialog弹出框下面的按钮不止一个 可以自己定义多个按钮 function view_show(cust_id){$.dialog({        id: 'view_c ...

  2. spring boot&&cloud干货系列

    接触spring boot也有些时日了,刚开始博主还想参照官方参考指南自己写一个系列的入门式的教程,包含spring boot的所有模块的用法,后来发现,有一大波优秀的系列文章和项目了,所以就没班门弄 ...

  3. 在Mysql中插入百万级别数据的方法

    首先,建立部门表和员工表: 部门表: create table dept( id int unsigned primary key auto_increment, deptno mediumint u ...

  4. Exchanger学习

    Java并发新构件之Exchanger JDK API Exchaner 介绍 JDK API 解释 A synchronization point at which threads can pair ...

  5. 利用CSS3伪类做3D按钮

    这是通过css3伪类实现的3d按钮,html代码为: <div id="container_buttons"> <p><a class="a ...

  6. 【JBPM4】State 节点

    State状态节点 相比 Task 节点的区别为: 主要是没有“操作人员”assignee 流程操作方便基本相同.如下: 部署流程: repositoryService.createDeploymen ...

  7. 搭建owncloud私有云

    参考:教程1,教程2,教程3,教程4 硬件:raspi 3b+ 系统:UbuntuMate 步骤: 1.安装Apache2 sudo apt-get install apache2 完成后访问服务器地 ...

  8. 前端读者 | 前端开发者调试面板vConsole

    来着微信团队开源的一个调试工具,[GitHub地址]https://github.com/Tencent/vConsole 一个轻量.可拓展.针对手机网页的前端开发者调试面板. 特性 查看 conso ...

  9. ImportError: No module named etree.ElementTree

    ImportError: No module named etree.ElementTree 排查N久,才发现是因为文件名是xml.py的缘故,文件名一定不要用关键词.....

  10. 【bzoj1132】[POI2008]Tro 计算几何

    题目描述 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 输入 第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10000] 输出 保留 ...