94. Binary Tree Inorder Traversal

二叉树的中序遍历,将每个节点中值保存在集合中,并返回,递归和递归两种方法:

方法一:利用二叉树的中序遍历,代码如下:

public class Solution {

   public List<Integer> inorderTraversal(TreeNode root) {

       List<Integer> ls=new ArrayList();

       inorderVisit(root,ls);

       return ls;

    }

   public void inorderVisit(TreeNode root, List<Integer> ls){

       if(root==null) return ;

       inorderVisit(root.left,ls);

       ls.add(root.val);

       inorderVisit(root.right,ls);

    }

}

方法二:非递归调用时,利用了Java中的栈集合,比较简单。分析一下,首先遍历头节点,为空,直接返回;若不为空,则将头节点入栈,栈不为空,将访问节点,如果节点的左孩子不为空,那么继续将它的左孩子栈,将此节点的左孩子设置为空(它的左孩子已经入过栈了);如果左孩子为空,则节点出栈,存储到集合中,看他的右孩是否为空,不为空,则将右孩子入栈;子代码如下:

public class Solution {

    public List<Integer> inorderTraversal(TreeNode root) {

       List<Integer> ls=new ArrayList();

      if(root ==null) return ls;

      Stack<TreeNode> stack=new Stack();

      stack.push(root);

      while(!stack.empty()){

          TreeNode n=stack.peek();

          if(n.left!=null){

               stack.push(n.left);

               n.left=null;

          }else{

               ls.add(n.val);

               stack.pop();

               if(n.right!=null){

                   stack.push(n.right);

               }

          }

      }

       return ls;

    }

}

方法三、这个也是递归调用,可能比上面的更加容易理解一点。分析:首先将最左孩子入栈,再看栈是否为空,不空,访问节点。判断节点的右孩子是否为空,不空,再将此节点的额最左孩子入栈,循环。代码如下:

public List<Integer>inorderTraversal(TreeNode root) {

        List<Integer> ls=new ArrayList();

      if(root ==null) return ls;

      Stack<TreeNode> stack=new Stack();

      TreeNode p=root;

      while(p!=null){

          stack.push(p);

          p=p.left;

      }

      while(!stack.isEmpty()){

          TreeNode t=stack.pop();

          ls.add(t.val);

          if(t.right!=null){

               t=t.right;

               while(t!=null){

                   stack.push(t);

                   t=t.left;

                  }

               }

              

      }

      return ls;

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值