leetcode102검지offer 면접문제 32 - II.위에서 아래로 두 갈래 나무 인쇄 II

11124 단어 LeetCode
제목: 위에서 아래로 층별로 두 갈래 나무를 인쇄하고 같은 층의 노드는 왼쪽에서 오른쪽으로 순서대로 인쇄하며 층마다 한 줄로 인쇄한다.
 :
 : [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7[
  [3],
  [9,20],
  [15,7]
]

팁: 노드 총 수 <= 1000
문제 풀이 사고방식: 핵심 절차는 이전의 면접 문제와 31번 차이가 많지 않다. 서로 다른 점은 인쇄 방식이 2차원 그룹이고 줄마다 길이가 다르기 때문에 c 언어로 처리하기 어렵고 줄의 길이를 끊임없이 부여하고 갱신해야 한다는 것이다.
코드 구현:
#define INT_MAX 1010
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
    if (root == NULL){          // 
        * returnSize = 0;
        return NULL;
    }
    // , , 
    struct TreeNode** Queue = (struct TreeNode**)calloc(INT_MAX, sizeof(struct TreeNode*));
    * returnColumnSizes = (int*)calloc(INT_MAX, sizeof(int));
    int** nums = (int**)calloc(INT_MAX, sizeof(int*));
    // , , 
    int head = 0;
    int tail = 0;
    * returnSize = 0;
    
    Queue[tail++] = root;                   // 
    int rowSize = tail - head;
    while (rowSize){
        nums[* returnSize] = (int*)calloc(rowSize, sizeof(int));    // 
        (* returnColumnSizes)[* returnSize] = rowSize;     
        for (int i = 0; i < rowSize; i++){
            if (Queue[head] -> left != NULL){
                Queue[tail++] = Queue[head] -> left;
            }
            if (Queue[head] -> right != NULL){
                Queue[tail++] = Queue[head] -> right;
            }
            nums[* returnSize][i] = Queue[head] -> val;
            head++;
        }
        (* returnSize)++;                                       // 
        rowSize = tail - head;                                  // 
    }
    return nums;
}

좋은 웹페이지 즐겨찾기