描述:

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

前序遍历:

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

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

样例

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

  1. 1
  2. \
  3. 2
  4. /
  5. 3

返回 [1,2,3].

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

中序遍历:

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

样例

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

  1. 1
  2. \
  3. 2
  4. /
  5. 3

返回 [1,3,2].

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

后序遍历:

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

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

样例

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

  1. 1
  2. \
  3. 2
  4. /
  5. 3

返回 [3,2,1]

C++解题思路:

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

前序:

递归一:

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. vector<int> sol;
  13.  
  14. void recurseSol(TreeNode * root) {
  15. if (!root) {
  16. return;
  17. }
  18. sol.push_back(root->val);
  19. recurseSol(root->left);
  20. recurseSol(root->right);
  21. }
  22.  
  23. vector<int> preorderTraversal(TreeNode* root) {
  24. recurseSol(root);
  25. return sol;
  26. }
  27. };

非递归与递归二:

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. //非递归
  13. vector<int> preorderTraversal2(TreeNode* root) {
  14. vector<int> res;
  15. stack<TreeNode*> s;
  16. TreeNode *p = root;
  17. while (p || !s.empty()) {
  18. while (p){
  19. s.push(p);
  20. res.push_back(p->val);
  21. p = p->left;
  22. }
  23. p = s.top();
  24. s.pop();
  25. p = p->right;
  26. }
  27. return res;
  28. }
  29. //递归
  30. vector<int> preorderTraversal(TreeNode* root) {
  31. vector<int> vec1,vec2;
  32. if (!root) {
  33. return vec1;
  34. }
  35. int r = root->val;
  36. vec1 = preorderTraversal(root->left);
  37. vec2 = preorderTraversal(root->right);
  38.  
  39. vec1.insert(vec1.begin(),r);
  40. vec1.insert(vec1.end(),vec2.begin(),vec2.end());
  41. return vec1;
  42. }
  43. };

中序:

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. //非递归
  13. vector<int> inorderTraversal2(TreeNode* root) {
  14. vector<int> res;
  15. stack<TreeNode*> s;
  16. TreeNode *p = root;
  17. while (p || !s.empty()) {
  18. while (p) {
  19. s.push(p);
  20. p = p->left;
  21. }
  22. p = s.top();
  23. s.pop();
  24. res.push_back(p->val);
  25. p = p->right;
  26. }
  27. return res;
  28. }
  29. //递归
  30. vector<int> inorderTraversal(TreeNode* root) {
  31. vector<int> vec1,vec2;
  32. if (!root) {
  33. return vec1;
  34. }
  35. vec1 = inorderTraversal(root->left);
  36. vec1.push_back(root->val);
  37. vec2 = inorderTraversal(root->right);
  38.  
  39. vec1.insert(vec1.end(),vec2.begin(),vec2.end());
  40. return vec1;
  41. }
  42. };

后序:

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

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. //非递归
  13. vector<int> postorderTraversal(TreeNode* root) {
  14. vector<int> res;
  15. if (!root){
  16. return res;
  17. }
  18. stack<TreeNode*> s;
  19. TreeNode *p = root;
  20. s.push(p);
  21. while (!s.empty()) {
  22. p = s.top();
  23. res.push_back(p->val);
  24. s.pop();
  25. if(p->left)
  26. s.push(p->left);
  27. if(p->right)
  28. s.push(p->right);
  29. }
  30. reverse(res.begin(),res.end());
  31. return res;
  32.  
  33. }
  34.  
  35. //递归
  36. vector<int> postorderTraversal2(TreeNode* root) {
  37. vector<int> vec1,vec2;
  38. if (!root) {
  39. return vec1;
  40. }
  41. vec1 = postorderTraversal(root->left);
  42. vec2 = postorderTraversal(root->right);
  43.  
  44. vec1.insert(vec1.end(),vec2.begin(),vec2.end());
  45. vec1.push_back(root->val);
  46. return vec1;
  47. }
  48. };

JAVA解题思路:

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

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

代码如下:

  1. package week1;
  2.  
  3. import java.awt.List;
  4. import java.util.ArrayList;
  5. import java.util.Stack;
  6.  
  7. public class 二叉树遍历 {
  8. /**
  9. * Definition of TreeNode:
  10. */
  11. public class TreeNode {
  12. public int val;
  13. public TreeNode left, right;
  14.  
  15. public TreeNode(int val) {
  16. this.val = val;
  17. this.left = this.right = null;
  18. }
  19. }
  20.  
  21. //==============先序遍历=======================================================
  22. /*
  23. * @param root: A Tree
  24. * @return: Preorder in ArrayList which contains node values.
  25. * 递归
  26. */
  27. public ArrayList<Integer> preorderTraversal(TreeNode root) {
  28. // write your code here
  29. ArrayList<Integer> list = new ArrayList<Integer>();
  30. if (root == null) return list;
  31. list.add(root.val); //先将根节点放入
  32. if(root.left != null) list.addAll(preorderTraversal(root.left)); //递归左子树,放入list中
  33. if(root.right != null) list.addAll(preorderTraversal(root.right)); //递归右子树,放入list中
  34. return list;
  35. }
  36.  
  37. /*
  38. * @param root: A Tree
  39. * @return: Preorder in ArrayList which contains node values.
  40. * 非递归
  41. */
  42. public ArrayList<Integer> preorderTraversal2(TreeNode root) {
  43. // write your code here
  44. ArrayList<Integer> res = new ArrayList<Integer>();
  45. if(root == null) return res;
  46. Stack<TreeNode> stack = new Stack<TreeNode>();
  47. stack.push(root); //入栈操作
  48. while(!stack.empty()){
  49. TreeNode node = stack.pop(); //当前节点出栈
  50. res.add(node.val);
  51. if(node.right != null) stack.push(node.right); //先入右子树节点,因为先进后出
  52. if(node.left != null) stack.push(node.left);
  53. }
  54. return res;
  55. }
  56.  
  57. //==============中序遍历=======================================================
  58. /**
  59. * 递归
  60. */
  61. public ArrayList<Integer> inorderTraversal(TreeNode root) {
  62. // write your code here
  63. ArrayList<Integer> list = new ArrayList<Integer>();
  64. if (root == null) return list;
  65. if(root.left != null) list.addAll(inorderTraversal(root.left));
  66. list.add(root.val);
  67. if(root.right != null) list.addAll(inorderTraversal(root.right));
  68. return list;
  69. }
  70.  
  71. /**
  72. * 非递归
  73. */
  74. public ArrayList<Integer> inorderTraversal2(TreeNode root) {
  75. // write your code here
  76. ArrayList<Integer> res = new ArrayList<Integer>();
  77. if(root == null) return res;
  78. Stack<TreeNode> stack = new Stack<TreeNode>();
  79. TreeNode node = root;
  80. while(node != null || !stack.empty()){
  81. while(node != null){ //一直遍历左子树入栈,直到左叶子节点,才开始下一步出栈
  82. stack.push(node);
  83. node = node.left;
  84. }
  85. node = stack.pop();
  86. res.add(node.val);
  87. node = node.right; //左-中-右
  88. }
  89. return res;
  90. }
  91.  
  92. //==============后序遍历=======================================================
  93. /**
  94. * 递归
  95. */
  96. public ArrayList<Integer> postorderTraversal(TreeNode root) {
  97. // write your code here
  98. ArrayList<Integer> list = new ArrayList<Integer>();
  99. if (root == null) return list;
  100. if(root.left != null) list.addAll(postorderTraversal(root.left));
  101. if(root.right != null) list.addAll(postorderTraversal(root.right));
  102. list.add(root.val);
  103. return list;
  104. }
  105.  
  106. /**
  107. * 非递归
  108. */
  109. public ArrayList<Integer> postorderTraversal2(TreeNode root) {
  110. // write your code here
  111. ArrayList<Integer> list = new ArrayList<Integer>();
  112. if (root == null) return list;
  113. Stack<TreeNode> stack = new Stack<TreeNode>();
  114. stack.push(root);
  115. while(!stack.empty()){
  116. TreeNode node = stack.pop();
  117. list.add(0,node.val); //此方法有两个参数,第一个参数指定插入位置,第二个为插入值,这里一直在0位置插入,意思是最新插入的一直在list的最前面,之前插入的到了后面
  118. if(node.left != null) stack.push(node.left);
  119. if(node.right != null) stack.push(node.right);
  120. }
  121. return list;
  122. }
  123. }

至此完成二叉树的遍历。  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. Codeforces548E:Mike and Foam

    Mike is a bartender at Rico's bar. At Rico's, they put beer glasses in a special shelf. There are n  ...

  2. LeetCode :: Sum Root to Leaf Numbers [tree、dfs]

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...

  3. 获取、增加、修改、删除sqlserver字段描述及快速查看表字段与描述

    先看添加与删除字段描述 EXEC sys.sp_addextendedproperty @name = N'MS_Description', --添加Type字段说明 @value = N'屏蔽类型对 ...

  4. java 实现HttpRequest 发送http请求

    package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...

  5. 《Lucene in Action》(第二版) 第一章节的学习总结 ---- 用最少的代码创建索引和搜索

    第一章节是介绍性质,但是通过这一章节的学习,我理解到如下概念: 1.Lucene由两部分组成:索引和搜索.索引是通过对原始数据的解析,形成索引的过程:而搜索则是针对用户输入的查找要求,从索引中找到匹配 ...

  6. oracle 累加功能,累加百分比

    最近做数据分析,需要用到累加功能,发现强大的oracle还真有,用over(order by field) 例子: 数据表中最后一列就是累加的效果 累加sql: select t.acc_pedal_ ...

  7. PHP性能:序——谈ab(Apache Bench)压力测试工具

    PHP性能:序——谈ab(Apache Bench)压力测试工具 ab(Apache  Bench)是啥? ab是Apache自带的一个压力测试软件,可以通过ab命令和选项对某个URL进行压力测试.a ...

  8. synchronized是什么

        在再有人问你Java内存模型是什么,就把这篇文章发给他中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchron ...

  9. FreeSWITCH 基础

    [1]FreeSWITCH 是什么? FreeSWITCH是一个开源的电话交换平台. 世界上第一个跨平台的.伸缩性极好的.免费的.多协议的电话软交换平台. 从技术上讲,FreeSWITCH是一个B2B ...

  10. TBSchedule源码阅读1-TBScheduleManagerFactory

    TBSchedule 1 TBScheduleManagerFactory 初始化    成员变量    ZKManager;    IScheduleDataManager;    Schedule ...