最もホットな質問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;
}
}