二分木のルートノードルートが与えられた場合、そのインオーダートラバーサルを返します。【LeetCodeHot100】

最もホットな質問100の質問94

方法1、再帰的方法:

最初に、バイナリツリーの順序どおりのトラバーサルとは何かを知る必要があります。左側のサブツリーノード-ルートノード-右側のサブツリーノード。つまり、ノードに遭遇すると、ノードの左側のサブツリーが最初にトラバースされ、トラバーサルが完了した後、ルートノードに到達し、最後に右側のサブツリーに到達します。以下に示すように:

次に、この二分木を順番にトラバースした結果は次のようになります。4 2 8 6 5 7 1 3;

この考え方により、ツリー全体を順番にトラバースする必要がある場合は、最初に左側のサブツリーをトラバースする必要があり、左側のサブツリーをトラバースする必要がある場合は、左側のサブツリーの左側のサブツリーを最初にトラバースする必要があることを理解できます。等 したがって、再帰を使用してこの問題を解決できます。具体的なコードは次のとおりです。

class Solution {

    List<Integer> answer = new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
        inorder(root);
        return answer;
    }

    public void inorder(TreeNode root){
        if(root == null){
            return;
        }
        inorder(root.left);
        answer.add(root.val);
        inorder(root.right);
    }
}

方法2、反復法:

反復法を使用する場合、再帰が不可能であるため、ノードをトラバースするときに、トラバースした各ノードを格納する必要があります。ここでは、スタックを使用して問題の解決を支援します。具体的なコードは次のとおりです。

class Solution {
     public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> answer = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;

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

おすすめ

転載: blog.csdn.net/weixin_56960711/article/details/123334931