Binary Tree Inorder Traversal

Iterative

在进入while循环之前什么都不做,先把cur=root。进去之后,首先再用一个while一直往左走直到尽头,也一路的存入stack,然后把顶元素存入result,并且这时候把cur变成顶元素的右儿子。

想象cur从root初始开始打怪兽。stack为空不加入root。在while里cur一路给stack充值直到cur空,然后stack pop给cur值,然后cur到right 继续。

注意此处while条件是or

Python

from typing import (
    List,
)
from lintcode import (
    TreeNode,
)

"""
Definition of TreeNode:
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None
"""

class Solution:
    """
    @param root: A Tree
    @return: Inorder in ArrayList which contains node values.
    """
    def inorder_traversal(self, root: TreeNode) -> List[int]:
        # write your code here
        res = []
        stack = []
        cur = root
        #一个while判断cur和stack即可
        while cur or stack:
            while cur:
                stack.append(cur)
                cur = cur.left
        
            cur = stack.pop()
            #List函数没有add
            res.append(cur.val)
            #只移动指针,不需要塞入栈,因为中序的话root已经遍历了,右树可以直接遍历无需栈。
            cur = cur.right
        #记得返回结果
        return res   

public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ret = new ArrayList<Integer>();
        if(root == null)
            return ret;
        Stack<TreeNode> s = new Stack<TreeNode>();
        TreeNode cur = root;

        while(cur != null || !s.isEmpty()){
            while(cur != null){
                s.push(cur);
                cur = cur.left;
            }
            cur = s.pop();
            ret.add(cur.val);
            cur = cur.right;
        }

        return ret;
    }

Recursive

    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ret = new ArrayList<Integer>();
        if(root == null)
            return ret;
        List<Integer> left = inorderTraversal(root.left);
        List<Integer> right = inorderTraversal(root.right);
        ret.addAll(left);
        ret.add(root.val);
        ret.addAll(right);
        return ret;
    }

Last updated