描述:

-------------------------------------------------------

前序遍历:

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

给出一棵二叉树,返回其节点值的前序遍历。

样例

给出一棵二叉树 {1,#,2,3},

   1
\
2
/
3

返回 [1,2,3].

----------------------------------------------------------

中序遍历:

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

样例

给出二叉树 {1,#,2,3},

   1
\
2
/
3

返回 [1,3,2].

------------------------------------------------------

后序遍历:

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

给出一棵二叉树,返回其节点值的后序遍历。

样例

给出一棵二叉树 {1,#,2,3},

   1
\
2
/
3

返回 [3,2,1]

C++解题思路:

用一个栈stack就可以解决问题,vector使用.push_back方法来将元素压入栈中。

前序:

递归一:

/**
* 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> sol; void recurseSol(TreeNode * root) {
if (!root) {
return;
}
sol.push_back(root->val);
recurseSol(root->left);
recurseSol(root->right);
} vector<int> preorderTraversal(TreeNode* root) {
recurseSol(root);
return sol;
}
};

非递归与递归二:

/**
* 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> preorderTraversal2(TreeNode* root) {
vector<int> res;
stack<TreeNode*> s;
TreeNode *p = root;
while (p || !s.empty()) {
while (p){
s.push(p);
res.push_back(p->val);
p = p->left;
}
p = s.top();
s.pop();
p = p->right;
}
return res;
}
//递归
vector<int> preorderTraversal(TreeNode* root) {
vector<int> vec1,vec2;
if (!root) {
return vec1;
}
int r = root->val;
vec1 = preorderTraversal(root->left);
vec2 = preorderTraversal(root->right); vec1.insert(vec1.begin(),r);
vec1.insert(vec1.end(),vec2.begin(),vec2.end());
return vec1;
}
};

中序:

/**
* 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> inorderTraversal2(TreeNode* root) {
vector<int> res;
stack<TreeNode*> s;
TreeNode *p = root;
while (p || !s.empty()) {
while (p) {
s.push(p);
p = p->left;
}
p = s.top();
s.pop();
res.push_back(p->val);
p = p->right;
}
return res;
}
//递归
vector<int> inorderTraversal(TreeNode* root) {
vector<int> vec1,vec2;
if (!root) {
return vec1;
}
vec1 = inorderTraversal(root->left);
vec1.push_back(root->val);
vec2 = inorderTraversal(root->right); vec1.insert(vec1.end(),vec2.begin(),vec2.end());
return vec1;
}
};

后序:

后序非递归采用的思路是先将二叉树排序为(根-右-左),然后利用reverse函数反转vector的序列。

/**
* 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> postorderTraversal(TreeNode* root) {
vector<int> res;
if (!root){
return res;
}
stack<TreeNode*> s;
TreeNode *p = root;
s.push(p);
while (!s.empty()) {
p = s.top();
res.push_back(p->val);
s.pop();
if(p->left)
s.push(p->left);
if(p->right)
s.push(p->right);
}
reverse(res.begin(),res.end());
return res; } //递归
vector<int> postorderTraversal2(TreeNode* root) {
vector<int> vec1,vec2;
if (!root) {
return vec1;
}
vec1 = postorderTraversal(root->left);
vec2 = postorderTraversal(root->right); vec1.insert(vec1.end(),vec2.begin(),vec2.end());
vec1.push_back(root->val);
return vec1;
}
};

JAVA解题思路:

递归实现二叉树的遍历相对简单,如果用list存放遍历结果,每次递归使用list.addall()方法即可添加“子树”;

使用非递归实现遍历比较复杂,这里我利用栈(stack)来实现节点的存取操作,使其顺利add进入list中返回。

代码如下:

 package week1;

 import java.awt.List;
import java.util.ArrayList;
import java.util.Stack; public class 二叉树遍历 {
/**
* Definition of TreeNode:
*/
public class TreeNode {
public int val;
public TreeNode left, right; public TreeNode(int val) {
this.val = val;
this.left = this.right = null;
}
} //==============先序遍历=======================================================
/*
* @param root: A Tree
* @return: Preorder in ArrayList which contains node values.
* 递归
*/
public ArrayList<Integer> preorderTraversal(TreeNode root) {
// write your code here
ArrayList<Integer> list = new ArrayList<Integer>();
if (root == null) return list;
list.add(root.val); //先将根节点放入
if(root.left != null) list.addAll(preorderTraversal(root.left)); //递归左子树,放入list中
if(root.right != null) list.addAll(preorderTraversal(root.right)); //递归右子树,放入list中
return list;
} /*
* @param root: A Tree
* @return: Preorder in ArrayList which contains node values.
* 非递归
*/
public ArrayList<Integer> preorderTraversal2(TreeNode root) {
// write your code here
ArrayList<Integer> res = new ArrayList<Integer>();
if(root == null) return res;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root); //入栈操作
while(!stack.empty()){
TreeNode node = stack.pop(); //当前节点出栈
res.add(node.val);
if(node.right != null) stack.push(node.right); //先入右子树节点,因为先进后出
if(node.left != null) stack.push(node.left);
}
return res;
} //==============中序遍历=======================================================
/**
* 递归
*/
public ArrayList<Integer> inorderTraversal(TreeNode root) {
// write your code here
ArrayList<Integer> list = new ArrayList<Integer>();
if (root == null) return list;
if(root.left != null) list.addAll(inorderTraversal(root.left));
list.add(root.val);
if(root.right != null) list.addAll(inorderTraversal(root.right));
return list;
} /**
* 非递归
*/
public ArrayList<Integer> inorderTraversal2(TreeNode root) {
// write your code here
ArrayList<Integer> res = new ArrayList<Integer>();
if(root == null) return res;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
while(node != null || !stack.empty()){
while(node != null){ //一直遍历左子树入栈,直到左叶子节点,才开始下一步出栈
stack.push(node);
node = node.left;
}
node = stack.pop();
res.add(node.val);
node = node.right; //左-中-右
}
return res;
} //==============后序遍历=======================================================
/**
* 递归
*/
public ArrayList<Integer> postorderTraversal(TreeNode root) {
// write your code here
ArrayList<Integer> list = new ArrayList<Integer>();
if (root == null) return list;
if(root.left != null) list.addAll(postorderTraversal(root.left));
if(root.right != null) list.addAll(postorderTraversal(root.right));
list.add(root.val);
return list;
} /**
* 非递归
*/
public ArrayList<Integer> postorderTraversal2(TreeNode root) {
// write your code here
ArrayList<Integer> list = new ArrayList<Integer>();
if (root == null) return list;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while(!stack.empty()){
TreeNode node = stack.pop();
list.add(0,node.val); //此方法有两个参数,第一个参数指定插入位置,第二个为插入值,这里一直在0位置插入,意思是最新插入的一直在list的最前面,之前插入的到了后面
if(node.left != null) stack.push(node.left);
if(node.right != null) stack.push(node.right);
}
return list;
}
}

至此完成二叉树的遍历。  by still

LeetCode:二叉树的前、中、后序遍历的更多相关文章

  1. Binary Tree Traversal 二叉树的前中后序遍历

    [抄题]:二叉树前序遍历 [思维问题]: 不会递归.三要素:下定义.拆分问题(eg root-root.left).终止条件 [一句话思路]: 节点非空时往左移,否则新取一个点 再往右移. [输入量] ...

  2. POJ 2255 Tree Recovery && Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)

    链接:poj.org/problem?id=2255 本文链接:http://www.cnblogs.com/Ash-ly/p/5463375.html 题意: 分别给你一个二叉树的前序遍历序列和中序 ...

  3. [C++] 非递归实现前中后序遍历二叉树

    目录 前置技能 需求描述 binarytree.h 具体实现 binarytree.cpp main.cpp 网上代码一搜一大片,大同小异咯. 书上的函数实现代码甚至更胜一筹,而且抄一遍就能用,唯一问 ...

  4. Qt实现 动态化遍历二叉树(前中后层次遍历)

    binarytree.h 头文件 #ifndef LINKEDBINARYTREE_H #define LINKEDBINARYTREE_H #include<c++/algorithm> ...

  5. C++二叉树前中后序遍历(递归&非递归)统一代码格式

    统一下二叉树的代码格式,递归和非递归都统一格式,方便记忆管理. 三种递归格式: 前序遍历: void PreOrder(TreeNode* root, vector<int>&pa ...

  6. C++实现对树的创建和前中后序遍历

    #include<iostream>#include<stdio.h> using namespace std; class BitNode{ public: char dat ...

  7. 数据结构-C语言递归实现树的前中后序遍历

    #include <stdio.h> #include <stdlib.h> typedef struct tree { int number ; struct tree *l ...

  8. 前中后序递归遍历树的体会 with Python

    前序:跟->左->右 中序:左->根->右 后序:左>右->根 采用递归遍历时,编译器/解释器负责将递归函数调用过程压入栈并保护现场,在不同位置处理根节点即可实现不 ...

  9. 二叉树前中后/层次遍历的递归与非递归形式(c++)

    /* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...

  10. LeetCode:N叉树的后序遍历【590】

    LeetCode:N叉树的后序遍历[590] 题目描述 给定一个 N 叉树,返回其节点值的后序遍历. 例如,给定一个 3叉树 : 返回其后序遍历: [5,6,3,2,4,1]. 题目分析 这道题有好几 ...

随机推荐

  1. uva 10034 Freckles (kruskal||prim)

    题目上仅仅给的坐标,没有给出来边的长度,不管是prim算法还是kruskal算法我们都须要知道边的长度来操作. 这道题是浮点数,也没啥大的差别,处理一下就能够了. 有关这两个算法的介绍前面我已经写过了 ...

  2. linux与开发板串口通信

    研究了一天的linux串口,结果改了树莓派的系统配置文件config.txt给改了导致系统崩溃....其实我感觉网上的大多数方法都是不符合新版本树莓派的,网上的方法是通过修改系统配置文件后安装mini ...

  3. 计算机网络11--OSI參考模型

    本页内容 1.OSI參考模型简单介绍 2.OSI參考模型通信过程 3.OSI參考模型的数据封装 4.数据封装的意义 5.物理层 6.数据链路层 7.网络层 8.传输层 9.会话层 10.表示层 11. ...

  4. A股市场底部顶部历史数据

    1. A股市场平均市盈率 大顶沪市平均市盈率:66-70倍. A股市场2次大底沪市平均市盈率:12倍-15倍. 大底时的例子. 2005年6月6日上证指数1000点时的14倍市盈率.2008年10月2 ...

  5. Debian 升级到 PHP 7,并支持并行安装

    Debian 开发者 Ondřej Surý 前几天在一个邮件列表中宣布他们开始迁移到 PHP 7.x 了,并支持多版本并行安装co-installable.而此前几天,Ubuntu 也宣布其下一个版 ...

  6. Ajax主要用来完成哪些工作?

    AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下. 它使用 JavaScript 在 web 浏览器与 web 服务器之间来发送和接收数据. ajax主要用于在页面内容加 ...

  7. php_screw加密安装

    php_screw的安装与使用 1.下载:http://sourceforge.net/projects/php-screw/files/ php文件通常以文本格式存贮在服务器端, 很容易被别人读到源 ...

  8. lua注册函数

    #include <stdio.h> #include <math.h> #define MAX_COLOR 255 extern "C" { #inclu ...

  9. Python 推导式、迭代器、生成器、模块和包

    一.推导式 (一).列表推导式(集合推导式也同理于此) 利用列表推导式,取出1-20内所有偶数 li = [i for i in range(1, 21) if i % 2 == 0] # 如果只有一 ...

  10. 做完task1-21的阶段总结

    [说明]这是自注册修真院的第七天,也是第七篇日报,觉得是一个好的时机总结一下. 因为任务一虽然看起来仅仅是“完成学员报名的DB设计并读写数据库”,但是做了几天之后就发现在任务“搭建自己的服务器”之前的 ...