LeetCode-94. 二叉树的中序遍历

LeetCode-94. 二叉树的中序遍历

给定一个二叉树,返回它的中序 遍历。

示例:

输入: [1,null,2,3]
   1
    \
     2
    /
   3

输出: [1,3,2]

思路

分为递归版本和非递归版本。

递归

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
 /**
    递归版本
 */
class Solution {

    List<Integer> res=new ArrayList<>();

    public List<Integer> inorderTraversal(TreeNode root) {

        if(root==null)
        {
            return res;
        }
        res=(inorderTraversal(root.left));
        res.add(root.val);
        res=(inorderTraversal(root.right));

        return res;

    }
}

非递归

中序遍历的顺序是左根右,而我们只能从root开始,要么向左遍历,要么向右遍历。我们可以先一直向左遍历,直到某个叶子节点,然后将遍历过程中的所有节点存入一个栈中。

接下来要看看这个叶子节点的右子树,对它的右子树,我们依然按照上述步骤来一遍。

如果它没有右子树,就出栈,继续看这个出栈的节点有木有右子树。

用一个变量指针和一个栈就可以搞定。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
 /**非递归版本*/
class Solution {
    
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res=new ArrayList<Integer>();
        Stack<TreeNode> stack=new Stack<>();

        TreeNode cur=root;
        while(cur!=null || !stack.isEmpty())
        {
            while(cur!=null)
            {
                stack.push(cur);
                cur=cur.left;
            }        
            cur=stack.pop();
            res.add(cur.val);
            //复用指针,cur要么是空,如果不是空,就重复以上步骤,压入以cur为根的子树的所有左边节点。
            //一个非空节点就能代表一棵树
            cur=cur.right;
        }
        return res;      
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章