二叉树的遍历

最近做到二叉树的题目,准备对二叉树做一个归纳总结。首先写一下二叉树的几种遍历方法吧

1.二叉树的前序遍历:根左右 preorderTraversal 。也就是按照根-左-右的顺序,迭代来遍历一棵二叉树,用栈存储右子树,把根存储了之后,遍历左子树,然后左子树遍历完了,就从栈中弹出右子树的节点,依旧按照根左右顺序进行遍历柚子树。

leetcode 144. 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 {
    public List<Integer> preorderTraversal(TreeNode node) {
        
        List<Integer> list = new LinkedList<Integer>();//记录结果
    Stack<TreeNode> rights = new Stack<TreeNode>(); //将右子树压栈
    while(node!=null){
        list.add(node.val);
        if(node.right!=null) rights.push(node.right);
        node = node.left;
        if(node==null&&!rights.isEmpty()){
            node = rights.pop();
        }
    }
    return list;
    
        
    }
}

  2.二叉树的中序遍历  左右根的顺序遍历。就是先遍历完左子树,然后遍历根,最后是右子树


/**
* 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<>();
Stack<TreeNode> sta = new Stack<>();
while(root!=null||!sta.isEmpty()){
while(root!=null){
sta.push(root);
root = root.left;

}
root = sta.pop();
res.add(root.val);
root =root.right;


}
return res;

}
}

3.后序遍历 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 {
    public List<Integer> postorderTraversal(TreeNode root) {
        
        LinkedList<Integer> ans = new LinkedList<>();
    Stack<TreeNode> stack = new Stack<>();
    if (root == null) return ans;
    
    stack.push(root);
    while (!stack.isEmpty()) {
        TreeNode cur = stack.pop();
        ans.addFirst(cur.val);
        if (cur.left != null) {
            stack.push(cur.left);
        }
        if (cur.right != null) {
            stack.push(cur.right);
        } 
    }
    return ans;
        
    }
}

如果不使用linkedlist 则:

/** 
     *  
     * @param root 树根节点 
     * 后序遍历不同于先序和中序,它是要先处理完左右子树,然后再处理根(回溯),所以需要一个记录哪些节点已经被访问的结构(可以在树结构里面加一个标记),这里可以用map实现 
     */  
    public static void postOrderStack(Node root){  
        if(root==null)return;  
        Stack<Node> s=new Stack<Node>();  
        Map<Node,Boolean> map=new HashMap<Node,Boolean>();   
        s.push(root);  
        while(!s.isEmpty()){  
            Node temp=s.peek();  
            if(temp.left!=null&&!map.containsKey(temp.left)){  
                temp=temp.left;  
                while(temp!=null){  
                    if(map.containsKey(temp))break;  
                    else s.push(temp);  
                    temp=temp.left;  
                }  
                continue;  
            }  
            if(temp.right!=null&&!map.containsKey(temp.right)){  
                s.push(temp.right);  
                continue;  
            }  
            Node t=s.pop();  
            map.put(t,true);  
            System.out.println(t.value);  
        }  
    }  

 

 

以上均为迭代的方法。

 

posted @ 2017-03-22 19:55  王小丸子  阅读(186)  评论(0编辑  收藏  举报