Leetcode——94. 二叉树的中序遍历(递归与非递归)

@

94. 二叉树的中序遍历

https://leetcode-cn.com/problems/binary-tree-inorder-traversal/submissions/

题目

给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
   1
    \
     2
    /
   3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

1、简单递归中序遍历

思想

用递归中序遍历即可,将遍历序列存入集合返回即可

代码

 /*
1、递归形式
 */
class Solution {
    public void inTr(TreeNode root, List<Integer> result) {
        if(root == null){
            return;
        }
        inTr(root.left, result);
        result.add(root.val);
        inTr(root.right, result);
    }
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        inTr(root, res);
        return res;
    }
}

2、中序非递归遍历

思想

用栈存储遍历的结点,首先向左遍历到树中最左端的叶子结点,然后将该叶子结点弹出加入结果集合;然后访问该结点的右孩子。递归该过程直至栈为空且当前遍历结点为空即可

代码

/*
2、中序非递归
*/

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Stack<TreeNode> s = new Stack<>();
        if(root == null){
            return res;
        }
        TreeNode cur = root;
        while(!s.isEmpty() || cur != null){//循环条件,满足一条还需继续
            while(cur != null){//未访问到叶结点,则加入栈并更新当前访问结点
                s.push(cur);
                cur = cur.left;
            }
            //访问到叶结点,则弹出当前栈顶结点,然后将该结点值加入结果集合并更新当前访问结点
            cur = s.pop();
            res.add(cur.val);
            cur = cur.right;
        }    
        return res;
    }
}

posted @ 2020-09-05 15:52  leonode  阅读(235)  评论(0)    收藏  举报