2017-09-27 2 views
0

따라서이 프로그램은 btree의 대칭을 결정합니다. 저를 혼란스럽게하는 것은 checkSymmetric이 같은 줄에서 두 번 호출된다는 것입니다. 그래서 우리가 checkSymmetric을 호출 할 때마다 호출 스택에 두 개의 새로운 스택 프레임을 추가해야한다는 뜻은 아니겠습니까? 만약 우리가 O (2^h)의 공간 복잡성을 가지고 있지 않다면?왜이 프로그램의 공간 복잡성은 O (h)입니까? 여기서 h는 btree의 높이입니다.

public static boolean isSymmetric(BinaryTreeNode<Integer> tree) { 
return tree == null || checkSymmetric(tree.left, tree.right); 
} 

private static boolean checkSymmetric(BinaryTreeNode<Integer> subtree0, 
            BinaryTreeNode<Integer> subtree1) { 
if (subtree0 == null && subtree1 == null) { 
    return true; 
} else if (subtree0 != null && subtree1 != null) { 
    return subtree0.data == subtree1.data 
     && checkSymmetric(subtree0.left, subtree1.right) 
     && checkSymmetric(subtree0.right, subtree1.left); 
} 
// One subtree is empty, and the other is not. 
return false; 
} 

답변

1

Google에서 도와 드리 겠지만 실제로 숙제는하지 않습니다.

혼란스러운 점은 checkSymmetric이 같은 줄에서 두 번 호출된다는 것입니다. 그래서 우리가 checkSymmetric을 호출 할 때마다 호출 스택에 두 개의 새로운 스택 프레임을 추가해야한다는 뜻은 아니겠습니까?

아니요, 두 통화가 순차적이며 병렬이 아니기 때문에 아니요. 정의에 따라 두 번째 호출 전에 하나의 호출 실행 범위에있는 모든 리소스가 해제됩니다.이 리소스는 모두 동시에 보유되지 않습니다. 여기에는 확실히 관련된 모든 스택 프레임이 포함됩니다.

그렇다면 우리는 O (2^h) 공간 복잡성을 가지고 있지 않아야합니까?

그렇다고해서 공간의 복잡성에 대해 어떻게 알 수 있습니까?

관련 문제