递归算法
**二叉树节点的定义。**
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
前序递归:
public static void preOrder(TreeNode tree) {
if (tree == null)
return;
System.out.printf(tree.val + "");
preOrder(tree.left);
preOrder(tree.right);
}
中序递归:
public static void inOrderTraversal(TreeNode node) {
if (node == null)
return;
inOrderTraversal(node.left);
System.out.println(node.val);
inOrderTraversal(node.right);
}
后序递归:
public void postOrder(TreeNode tree) {
if (tree == null)
return;
postOrder(tree.left);
postOrder(tree.right);
System.out.println(tree.val);
}
迭代算法
**二叉树节点的定义。**
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
前序递归:
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
Deque<TreeNode> stk = new LinkedList<TreeNode>();
while(root!=null){
res.add(root.val);
while(root!=null){
if(root.right!=null){
stk.push(root.right);
}
root=root.left;
if(root!=null){
res.add(root.val);
}
}
if(!stk.isEmpty()){
root=stk.pop();
}
}
return res;
}
}
中序递归:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
Deque<TreeNode> stk = new LinkedList<TreeNode>();
while(root!=null||!stk.isEmpty()){
while(root!=null){
stk.push(root);
root=root.left;
}
root=stk.pop();
res.add(root.val);
root=root.right;
}
return res;
}
}
后序递归:(***重点)
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
Deque<TreeNode> stk = new LinkedList<TreeNode>();
TreeNode cur=root;
TreeNode flag=null;
while(!stk.isEmpty()||cur!=null){
while(cur!=null){
stk.push(cur);
cur=cur.left;
}
cur=stk.peek();
if(cur.right==null||cur.right==flag){
res.add(cur.val);
stk.pop();
flag=cur;
cur=null;
}else{
cur=cur.right;
}
}
return res;
}
}
简单对比,递归真是个好算法,不过其它解法也很有特色。