leetcode-Binary Tree Inorder Traversal

Given a binary tree, return the inorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},

   1
    \
     2
    /
   3

return [1,3,2].

树的中序遍历

package leetcode;

import java.util.*;
//方法一 数据结构:树的中序遍历:1、递归 2、非递归
//始终操作的是根节点 ->( root=root.left),把右边节点移到根节点上进行;
public class BinaryTreeInorderTraversal {
    private class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) {
            val = x;
        }
    }
    /*public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        addNode(list,root);
        return list;
    }
    public void addNode(List<Integer> list,TreeNode root){                //参数只能传入List类型,不能传ArrayList类型
        if(root == null)  return;    //什么都不返回
        addNode(list,root.left);
        list.add(root.val);
        addNode(list,root.right);           
    }*/
    //方法二 :思想:1、先找到叶子结点,然后把每个点当作根节点分析,然后逐层出栈(入栈:顶向下;出栈:下向上!)
    //非递归方法:1、list用来存储结果;2stack : 用来操作这个树,
     public List<Integer> inorderTraversal(TreeNode root) {
          List<Integer> list =new ArrayList();
            Stack<TreeNode> stack=new Stack();
            if(root==null) return list;
            while(root!=null){
                stack.push(root);
                root=root.left;     //先把左边的数都存到栈里,
                while(root==null){  //当左子节点为空时(此时其仍为子根节点),
                                    //再往下没有节点,就存入,然后判断有没有右子节点,若有,就以右子节点为根继续遍历
                                    //若没有则,出栈,将元素存入list
                               
                    if(stack.empty()) return list;
                    root=stack.pop();
                    list.add(root.val);
                    root=root.right;
                }
            }
            return list;
            
            
        }
    
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}

posted @ 2016-04-19 12:39  wangb021  阅读(118)  评论(0编辑  收藏  举报