好久不看数据结果,看了一周论文, 头大~正好有人说道这个,复习下二叉树的各种遍历压压惊。
二叉树的遍历方式我不一一介绍了,直接上代码。
前序遍历:
leetcode 题目:https://leetcode.com/problems/binary-tree-preorder-traversal/
- 递归实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
List<Integer> res = new ArrayList<Integer>();
public List<Integer> preorderTraversal(TreeNode root) {
preTraversal(root);
return res;
}
public void preTraversal(TreeNode root){
if(null == root)
return;
res.add(root.val);
if(null!=root.left) preTraversal(root.left);
if(null!=root.right) preTraversal(root.right);
}
}
- 迭代实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
List<Integer> res = new ArrayList<Integer>();
if (null == root)
return res;
while (!stack.isEmpty()) {
TreeNode tmp = stack.pop();
if (null != tmp)
res.add(tmp.val);
if (tmp.right != null)
stack.push(tmp.right);
if (tmp.left != null)
stack.push(tmp.left);
}
return res;
}
}
中序遍历
leetcode题目:https://leetcode.com/problems/binary-tree-inorder-traversal/
- 递归实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
List<Integer> res = new ArrayList<Integer>();
public List<Integer> inorderTraversal(TreeNode root) {
inTraversal(root);
return res;
}
public void inTraversal(TreeNode root){
if(null == root)
return;
if(null != root.left) inTraversal(root.left);
res.add(root.val);
if(null != root.right) inTraversal(root.right);
}
}
- 迭代实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode tmp = root;
do{
while(tmp!=null){
stack.push(tmp);
tmp = tmp.left;
}
if(!stack.isEmpty()){
tmp = stack.pop();
res.add(tmp.val);
tmp = tmp.right;
}
}while(!stack.isEmpty()||tmp!=null);
return res;
}
}
后序遍历
leetcode题目:https://leetcode.com/problems/binary-tree-postorder-traversal/
- 递归实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
List<Integer> res = new ArrayList<Integer>();
public List<Integer> postorderTraversal(TreeNode root) {
postTraversal(root);
return res;
}
public void postTraversal(TreeNode root){
if(null == root)
return;
if(null != root.left) postTraversal(root.left);
if(null != root.right) postTraversal(root.right);
res.add(root.val);
}
}
- 迭代实现
- 这个解决方法是我是参考别人的,严格来说,其实不算后序遍历,只不过利用List的特性,每次都头部插入,插入的顺序其实有点类似先序,先插入root,再插入root.right,再插入root.left。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<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(0,node.val);
if(node.left != null) stack.push(node.left);
if(node.right != null) stack.push(node.right);
}
return res;
}
}
大家如有更好的办法,欢迎讨论,尤其是后序遍历