前序遍历

[144] Binary Tree Preorder Traversal

递归遍历

使用递归,先保存父节点的值,再对左子树进行遍历(递归),最后对右子树进行遍历(递归)

    vector<int> preorderTraversal(TreeNode* root) {
vector<int> re;
preTraversal(root, re);
return re;
} void preTraversal(TreeNode* root, vector<int>& re)
{
if (!root)
{
return;
}
re.push_back(root->val);
preTraversal(root->left, re);
preTraversal(root->right, re);
}

非递归遍历

方法一: 使用一个辅助栈(利用栈的后进先出的特性),先一直找左子树直到左子树为null(此过程中将遍历到的节点的值保存并且将这些节点压入栈中)。再弹出栈顶元素,对其右子树再做以上操作。直到栈为空。

vector<int> preorderTraversal(TreeNode* root)
{
vector<int> vec;
stack<TreeNode*> st;
while (root or !st.empty())
{
while (root)
{
vec.push_back(root->val);
st.push(root);
root = root->left;
}
if (!st.empty())
{
auto temp = st.top();
st.pop();
root = temp->right;
}
}
return vec;
}

方法二:

使用一个辅助栈来完成(利用栈的后进先出的特性)。先将父节点的值保存,然后将右子树压入栈中,再将左子树压入栈中(注意顺序,要保证出栈的时候左子树在右子树先)。再对栈顶元素进行上述操作。直到栈为空。

vector<int> postorderTraversal(TreeNode* root) {
vector<int> re;
if (!root)
{
return re;
}
stack<TreeNode*> st;
st.push(root);
while (!st.empty())
{
auto tmp = st.top();
re.push_back(tmp->val);
st.pop();
if (tmp->left)
{
st.push(tmp->left);
}
if (tmp->right)
{
st.push(tmp->right);
}
}
reverse(re.begin(), re.end());
return re;
}

中序遍历

[94] Binary Tree Inorder Traversal

递归遍历

使用递归,再对左子树进行遍历(递归),先保存父节点的值,最后对右子树进行遍历(递归)

    vector<int> inorderTraversal(TreeNode* root) {
vector<int> re;
inTraversal(root, re);
return re;
} void inTraversal(TreeNode* root, vector<int>& re)
{
if (!root)
{
return;
}
inTraversal(root->left, re);
re.push_back(root->val);
inTraversal(root->right, re);
}

非递归遍历

后前序遍历思路一致,只是保存值的地方改变了。在节点出栈的时候再保存值,这样可以实现先保存左子树的值再保存父节点的值。

vector<int> inorderTraversal(TreeNode* root)
{
vector<int> vec;
stack<TreeNode*> st;
while (root or !st.empty())
{
while (root)
{
st.push(root);
root = root->left;
}
if (!st.empty())
{
auto temp = st.top();
vec.push_back(temp->val);
st.pop();
root = temp->right;
}
}
return vec;
}

后序遍历

[145] Binary Tree Postorder Traversal

递归遍历

使用递归,再对左子树进行遍历(递归),再对右子树进行遍历(递归),最后先保存父节点的值

    vector<int> postorderTraversal(TreeNode* root) {
vector<int> re;
traversal(root, re);
return re;
} void traversal(TreeNode* root, vector<int>& re)
{
if (!root)
{
return;
}
traversal(root->left, re);
traversal(root->right, re);
re.push_back(root->val);
}

非递归遍历

前序遍历:根-左-右

后续遍历:左-右-根

可以看到,在前序遍历的时候先遍历右子树再遍历左子树那么顺序就变成了根-右-左,再翻转就变成了后续遍历 左-右-根。根据此思路我们可以先对前序遍历的非递归遍历方法二进行一点点改造,再把结果翻转,就得到了后续遍历的非递归遍历的结果

vector<int> postorderTraversal(TreeNode* root) {
vector<int> re;
if (!root)
{
return re;
}
stack<TreeNode*> st;
st.push(root);
while (!st.empty())
{
auto tmp = st.top();
re.push_back(tmp->val);
st.pop();
if (tmp->left)
{
st.push(tmp->left);
}
if (tmp->right)
{
st.push(tmp->right);
}
}
reverse(re.begin(), re.end());
return re;
}

层次遍历

[102] Binary Tree Level Order Traversal

使用一个辅助队列(利用队列的先进先出特性)。将根节点压入队列中,获取当前队列大小,对当前队列中的所有节点进行遍历,保存其值,若其左右子树非空,则将其入队。直到队列为空为止。

vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> qu;
vector<vector<int>> re;
qu.push(root);
while (!qu.empty() and root)
{
vector<int> tmp;
int size = qu.size();
for (int i = ; i < size; ++i)
{
auto ele = qu.front();
qu.pop();
tmp.push_back(ele->val);
if (ele->left)
{
qu.push(ele->left);
}
if (ele->right)
{
qu.push(ele->right);
}
}
re.push_back(tmp);
}
return re;
}

[leetcode] 二叉树的前序,中序,后续,层次遍历的更多相关文章

  1. hihocoder(第十周)二叉树(前序中序推后续)递推实现

    题目 : 后序遍历 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常有意思 ...

  2. Java 重建二叉树 根据前序中序重建二叉树

    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...

  3. PAT甲题题解-1064. Complete Binary Search Tree (30)-中序和层次遍历,水

    由于是满二叉树,用数组既可以表示父节点是i,则左孩子是2*i,右孩子是2*i+1另外根据二分搜索树的性质,中序遍历恰好是从小到大排序因此先中序遍历填充节点对应的值,然后再层次遍历输出即可. 又是一道遍 ...

  4. Python实现二叉树的前序、中序、后序、层次遍历

      有关树的理论部分描述:<数据结构与算法>-4-树与二叉树:   下面代码均基于python实现,包含: 二叉树的前序.中序.后序遍历的递归算法和非递归算法: 层次遍历: 由前序序列.中 ...

  5. Construct Binary Tree from Preorder and Inorder Traversal(根据前序中序构建二叉树)

    根据前序中序构建二叉树. 1 / \ 2 3 / \ / \ 4 5 6 7对于上图的树来说, index: 0 1 2 3 4 5 6 先序遍历为: 6 3 7为了清晰表示,我给节点上了颜色,红色是 ...

  6. 数据结构实习 - problem K 用前序中序建立二叉树并以层序遍历和后序遍历输出

    用前序中序建立二叉树并以层序遍历和后序遍历输出 writer:pprp 实现过程主要是通过递归,进行分解得到结果 代码如下: #include <iostream> #include &l ...

  7. 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序

    接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...

  8. 【美国血统 American Heritage 题解】已知前序中序 求后序

    题目: 题目名称:美国血统 American Heritage 题目来源:美国血统 American Heritage ## 题目描述 农夫约翰非常认真地对待他的奶牛们的血统.然而他不是一个真正优秀的 ...

  9. Tree Recovery(前序中序求后序)

    Tree Recovery Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14640   Accepted: 9091 De ...

  10. 前序+中序->后序 中序+后序->前序

    前序+中序->后序 #include <bits/stdc++.h> using namespace std; struct node { char elem; node* l; n ...

随机推荐

  1. Servlet - Reasource loading

    1. Load db3.properties String path = this.getServletContext().getRealPath("/WEB-INF/classes/db/ ...

  2. numpy数组属性查看及断言

    numpy数组属性查看:类型.尺寸.形状.维度   import numpy as np a1 = np.array([1,2,3,4],dtype=np.complex128) print(a1) ...

  3. 整理一下最近Android面试的提问

    java相关: 1. public protect private default关键字有什么区别? public:表示可以在任何一个类中被访问: protect:表示可以在自身.子类以及同一包下的类 ...

  4. C#中的基础数据类型

    一.C#有15个预定义类型,13个值类型,两个引用类型(string和object): 1.整型 int a=15; short a=15; 2.浮点类型 float a=12.9; double a ...

  5. 存储过程存储过程需要用两个'',先where再Group,再Order by

    存储过程需要用两个'',先where再Group,再Order by  未完,待续

  6. 使用Facebook开源代码FBShimmering封装进度显示的ShimmeCircleView

    使用Facebook开源代码FBShimmering封装进度显示的ShimmeCircleView 效果图: 静态图: 源码: ShimmeCircleView.h 与 ShimmeCircleVie ...

  7. Python学习---面向对象的学习[深入]

    类的深入学习    a. Python中一切事物都是对象     b. class Foo:             pass                obj = Foo()         # ...

  8. Asp.Net MVC Identity 2.2.1 使用技巧(二)

    之前我们看到了新生成的项目中跟identity有关的有四个文件,这些文件是基础功能,并未开启identity的全部功能.现在我们先启用角色功能. 1.在App_Start文件夹中的IdentityCo ...

  9. redis下的adlist

    //adlist.h #ifndef __ADLIST__H__ #define __ADLIST__H__ typedef struct listNode_ { struct listNode_ * ...

  10. 《梦断代码》读书笔记 part3

    第六章:搞掂设计方案 备份很重要. 必须从小项目开始,而且永远不要期望它变大,如果你这么想,就会做过度设计,把它想象得过于重要,更坏的情况是,你可能会被自己想象中的艰难工作所吓到.所以要从小 处起步, ...