【LeetCode】Binary Tree Preorder Traversal 二叉树的前序遍历(3种方法)- Easy+
2017-10-16 07:56
549 查看
二叉树的前序遍历
给出一棵二叉树,返回其节点值的前序遍历。
样例
给出一棵二叉树 {1,#,2,3},
1
\
2
/
3
返回 [1,2,3].
挑战
你能使用非递归实现么?
3种方法:非递归、递归、分治
(1)Java
(2)C++
给出一棵二叉树,返回其节点值的前序遍历。
样例
给出一棵二叉树 {1,#,2,3},
1
\
2
/
3
返回 [1,2,3].
挑战
你能使用非递归实现么?
3种方法:非递归、递归、分治
(1)Java
/** * 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; * } * } */ //Version 1(Non-recursion)[Recommend] public class Solution { /* * @param root: A Tree * @return: Preorder in ArrayList which contains node values. */ public List<Integer> preorderTraversal(TreeNode root) { Stack<TreeNode> stack = new Stack<TreeNode>(); List<Integer> preorder = new ArrayList<Integer>(); if(root == null){ return preorder; } stack.push(root); //根左右:最先进栈的root,最先出栈。然后,依次将右,左子节点 进栈,每次循环出栈(并存入preorder列表)的顺序满足先左后右。 //即满足前序遍历:根左右 while(!stack.empty()){ TreeNode node = stack.pop(); preorder.add(node.val); if(node.right != null){ stack.push(node.right); } if(node.left != null){ stack.push(node.left); } } return preorder; } } //Version2 public class Solution{ public ArrayList<Integer> preorderTraversal(TreeNode root) { ArrayList<Integer> result = new ArrayList<Integer>(); traverse(root, result); return result; } // 把root为跟的preorder加入result里面 private void traverse(TreeNode root, ArrayList<Integer> result){ if(root == null){ return; } result.add(root.val); traverse(root.left, result); traverse(root.right, result); } } //Version 3:Divide & Conquer public class Solution{ public ArrayList<Integer> preorderTraversal(TreeNode root) { ArrayList<Integer> result = new ArrayList<Integer>(); //null or leaf if(root == null){ return result; } //Divide ArrayList<Integer> left = preorderTraversal(root.left); ArrayList<Integer> right = preorderTraversal(root.right); //Conquer result.add(root.val); result.addAll(left); result.addAll(right); return result; } }
(2)C++
#include <vector> using namespace std; /** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public: vector<int> preorder; void traverse(TreeNode *root) { if (root == NULL) { return; } preorder.push_back(root->val); traverse(root->left); traverse(root->right); } vector<int> preorderTraversal(TreeNode *root) { preorder.clear(); traverse(root); return preorder; } };
相关文章推荐
- LeetCode:Binary Tree Preorder Traversal(非递归方法前序遍历二叉树)
- LeetCode 144 Binary Tree Preorder Traversal(二叉树的前序遍历)+(二叉树、迭代)
- [LeetCode]108. Construct Binary Tree from Preorder and Inorder Traversal由前序序列和中序序列重建二叉树
- LeetCode:Binary Tree Preorder Traversal(二叉树的先序遍历)
- leetcode:二叉树之Construct Binary Tree from Preorder and Inorder Traversal
- [LintCode] 前序遍历和中序遍历树构造二叉树 Construct Binary Tree from Preorder and Inorder Traversal
- 【leetcode】非递归先序遍历二叉树(Binary Tree Preorder Traversal)
- 【LeetCode-面试算法经典-Java实现】【105-Construct Binary Tree from Preorder and Inorder Traversal(构造二叉树)】
- LeetCode Binary Tree Preorder Traversal (二叉树先序遍历非递归)
- leetcode_144题——Binary Tree Preorder Traversal(二叉树,递归,栈的使用)
- [leetcode]Construct Binary Tree from Preorder and Inorder Traversal(根据前序、中序遍历确定一棵二叉树 C语言)
- LeetCode-105:Construct Binary Tree from Preorder and Inorder Traversal (利用先序和中序遍历构建二叉树) -- medium
- LeetCode-Construct Binary Tree from Preorder and Inorder Traversal-前序中序恢复二叉树-递归
- LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal (用先序和中序树遍历来建立二叉树)
- LeetCode:144_Binary Tree Preorder Traversal | 二叉树的前序遍历 | Medium
- 【LeetCode-面试算法经典-Java实现】【144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)】
- [LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树
- leetcode 题解:Binary Tree Preorder Traversal (二叉树的先序遍历)
- LeetCode:105_Construct Binary Tree from Preorder and Inorder Traversal | 根据前序和中序遍历构建二叉树 | Medium
- Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal 先序和中序中恢复二叉树 解题报告