前序遍历

http://www.lintcode.com/en/problem/binary-tree-preorder-traversal/

注意点:非递归;将结果作为参数传递的遍历;分治

 1  //分治
 2  public ArrayList<Integer> preorderTraversal(TreeNode root) {
 3      ArrayList<Integer> result = new ArrayList<Integer>();
 4      if(root == null) return result;
 5      result.add(root.val);
 6      ArrayList<Integer> left = preorderTraversal(root.left);
 7      ArrayList<Integer> right = preorderTraversal(root.right);
 8      result.addAll(left);
 9      result.addAll(right);
10      return result;
11
12  }
13  //非递归
14   public ArrayList<Integer> preorderTraversal(TreeNode root) {
15      ArrayList<Integer> result = new ArrayList<Integer>();
16      if(root == null) return result;
17      Stack<TreeNode> s = new Stack<TreeNode>();
18      s.push(root);
19      while(!s.empty()) {
20          TreeNode node = s.pop();
21          result.add(node.val);
22          if(node.right != null) s.push(node.right);
23          if(node.left != null) s.push(node.left);
24      }
25     return result;
26
27   }
28  //游走遍历, 要返回的结果一直作为参数在传递
29  public ArrayList<Integer> preorderTraversal(TreeNode root) {
30         ArrayList<Integer> result = new ArrayList<Integer>();
31         return    traverse(root, result);
32   }
33  private ArrayList<Integer> traverse(TreeNode root, ArrayList<Integer> result) {
34      if(root == null) return result;
35      result.add(root.val);
36      traverse(root.left, result);
37      traverse(root.right, result);
38      return result;
39  }

时间: 2024-10-10 13:00:22

前序遍历的相关文章

前序遍历和中序遍历树构造二叉树

例子 题目来自LintCode, 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回例如以下的树: 2 / 1 3 代码实现 /** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } *

根据二叉树的前序遍历和中序遍历重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(

leetcode | 二叉树的前序遍历、中序遍历、后续遍历的非递归实现

Binary Tree Preorder Traversal:https://leetcode.com/problems/binary-tree-preorder-traversal/ Binary Tree Inorder Traversal :https://leetcode.com/problems/binary-tree-inorder-traversal/ Binary Tree Postorder Traversal:https://leetcode.com/problems/bin

(原)neuq oj 1022给定二叉树的前序遍历和后序遍历确定二叉树的个数

题目描述 众所周知,遍历一棵二叉树就是按某条搜索路径巡访其中每个结点,使得每个结点均被访问一次,而且仅被访问一次.最常使用的有三种遍历的方式: 1.前序遍历:若二叉树为空,则空操作:否则先访问根结点,接着前序遍历左子树,最后再前序遍历右子树. 2.中序遍历:若二叉树为空,则空操作:否则先中序遍历左子树,接着访问根结点,最后再前中遍历右子树. 3.后序遍历:若二叉树为空,则空操作:否则先后序遍历左子树,接着后序遍历右子树,最后再访问根结点. 现在的问题是给定前序遍历和后序遍历的顺序,要求出总共有多

由二叉树的前序遍历和后序遍历来求后序遍历的结果

假设有棵树,长下面这个样子,它的前序遍历,中序遍历,后续遍历都很容易知道. PreOrder:         GDAFEMHZ InOrder:            ADEFGHMZ PostOrder:       AEFDHZMG 现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是"GDAFEMHZ",而中序遍历是"ADEFGHMZ"应该如何求后续遍历? 第一步,root最简单,前序遍历的第一节点G就是root. 第二步,继续观

小甲鱼数据结构和算法-----二叉树的构建和前序遍历

题目要求:建立二叉树并输出每个字符所在的层数.如下图要求输出 A 在第一层 B.C 在第二层 D.E在第三层 代码如下: #include <stdio.h> #include <stdlib.h> typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; // 创建一棵二叉树,约定用户遵照前序遍历的方式输入数据 void CreateBiTree(BiTree *T)

二叉查找树的前序遍历,后序遍历和中序遍历互求算法模板

面试的痛 前几天去阿里面试,一时忘记了二叉树的前序遍历中序遍历和后序遍历的概念,已经想死了. 然后最近去腾讯面试,被问到怎么已知前序遍历/后序遍历 + 中序遍历,求后序遍历/前序遍历,看来这种问题很喜欢考. 其实这个问题想清楚了很简单,只要把这三个概念理解透彻就可以做出来了,比如前序遍历的第一个值一定是根节点,然后这个根节点对应到中序遍历里面,在中序遍历的这个值的两边的值,一定在以此节点为根节点的两个子树上,同理,后序遍历也一样. 已知前序遍历和后序遍历是不能求唯一的中序遍历树的. #inclu

LintCode 二叉树的前序遍历

给出一棵二叉树,返回其节点值的前序遍历. 样例 给出一棵二叉树 {1,#,2,3}, 1 2 / 3 返回 [1,2,3]. 挑战 你能使用非递归实现么? 分析:使用非递归实现(栈) * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->

已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或者后序遍历的最后一个结点,查找对应在中序遍历中的位置,就可以确定左子树包含的元素和右子树包含的元素,最后通过递归来实现就可以了. 二叉树的表示形式为 //二叉树的结构表示为 class TreeNode { int val; TreeNode left; TreeNode right; TreeNo

根据二叉树的中序遍历和前序遍历,还原二叉树

现在有一个问题,已知二叉树的前序遍历和中序遍历:PreOrder:         GDAFEMHZInOrder:            ADEFGHMZ我们如何还原这颗二叉树,并求出他的后序遍历? 我们基于一个事实:中序遍历一定是 { 左子树中的节点集合 },root,{ 右子树中的节点集合 },前序遍历的作用就是找到每颗子树的root位置. 算法1输入:前序遍历,中序遍历1.寻找树的root,前序遍历的第一节点G就是root.2.观察前序遍历GDAFEMHZ,知道了G是root,剩下的节点