[LeetCode]144. Binary Tree Preorder Traversal

2145 단어
Given a binary tree, return the preorder traversal of its nodes' values.
For example: Given binary tree {1,#,2,3} ,
  1 
   \
    2
   / 
  3

return [1,2,3] .
Note: Recursive solution is trivial, could you do it iteratively?
방법
앞의 두 갈래 나무가 두루 다니니 귀속할 방법이 없으니 창고를 빌려야 한다.먼저 루트를 창고에 넣고 꺼내서 오른쪽 노드를 창고에 넣고 왼쪽 노드를 창고에 넣는다.그리고 창고의 노드를 꺼내 이 노드의 오른쪽, 왼쪽 노드를 눌러 창고가 비어 있을 때까지 순환하면 된다.
c 코드
#include 
#include 

struct TreeNode {
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
};

/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    if(root == NULL)
        return NULL;

    int *vals = (int *)malloc(sizeof(int) * 1000);
    int valsTop = 0;
    struct TreeNode* node = root;
    struct TreeNode** nodes = (struct TreeNode **)malloc(sizeof(struct TreeNode *) * 1000);
    int nodesTop = 0;
    nodes[nodesTop++] = root;

    while(nodesTop > 0) {
        node = nodes[--nodesTop];
        vals[valsTop++] = node->val;

        if(node->right)
            nodes[nodesTop++] = node->right;
        if(node->left)
            nodes[nodesTop++] = node->left;
    }
    *returnSize = valsTop;
    return vals;
}

int main() {
    struct TreeNode* root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
    root->val = 1;
    struct TreeNode* node1_2 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
    node1_2->val = 2;
    root->left = NULL;
    root->right = node1_2;
    struct TreeNode* node2_3 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
    node2_3->val = 3;
    node1_2->left = node2_3;
    node1_2->right = NULL;
    node2_3->left = NULL;
    node2_3->right = NULL;

    int returnSize = 0;
    int* vals = preorderTraversal(root, &returnSize);
    assert(returnSize == 3);
    assert(vals[0] == 1);
    assert(vals[1] == 2);
    assert(vals[2] == 3);

    return 0;
}

좋은 웹페이지 즐겨찾기