leetcode 94.二叉树的中序遍历

思路一:递归

很简单,我们定义一个递归函数,然后按照中序遍历的顺序就是先左子树,再中间结点,然后就是右子树的规律进行递归;

首先把当前结点的左子树遍历,然后再在这个左子树的基础上再次遍历左子树,直至没有左子树为止。当没有左子树之后就开始存储值,然后继续遍历当前结点的右子树,然后存储值,依次类推,递归之后再向上合并之后就是答案。

根据这个特性,我们知道每一个结点都需要判断左子树和右子树的递归,这就需要写一个让每个遍历到的结点都能够进行递归左子树和右子树同时存储值的操作。所以需要额外制定一个函数来进行处理。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer>list=new ArrayList<Integer>();
        Deque<TreeNode>stk=new LinkedList<TreeNode>();
        while(root!=null||!stk.isEmpty()){
            while(root!=null){
                stk.push(root);
                root=root.left;
            }
            TreeNode tmp=stk.pop();
            list.add(tmp.val);
            root=tmp.right;
        }
        return list;
    }
}

思路二:迭代

上面递归的做法,其实无异于用一个栈存储了递归函数,然后一个一个拿出来进行处理而已。

所以相应的,我们也可以自己定义一个栈维护结点,我们直接遍历从当前根结点开始,遍历所有的root的左子树,不断迭代,直至null,同时当里面入栈。结束了之后,我们再从这个栈中一个一个拿出来,遍历其右子树,然后在右子树的基础上再遍历左子树....以此类推。和递归的原理是一样的,只不过实现形式不一样。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer>list=new ArrayList<Integer>();
        Deque<TreeNode>stk=new LinkedList<TreeNode>();
        while(root!=null||!stk.isEmpty()){
            while(root!=null){
                stk.push(root);
                root=root.left;
            }
            TreeNode tmp=stk.pop();
            list.add(tmp.val);
            root=tmp.right;
        }
        return list;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值