From 76417bc1aa1e4c494f8b9f3a8c1413160d773c02 Mon Sep 17 00:00:00 2001 From: begeekmyfriend Date: Wed, 27 Sep 2017 10:49:43 +0800 Subject: [PATCH] BST preorder traversal Signed-off-by: begeekmyfriend --- 144_binary_tree_preorder_traversal/Makefile | 2 + .../bst_preorder.c | 61 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 144_binary_tree_preorder_traversal/Makefile create mode 100644 144_binary_tree_preorder_traversal/bst_preorder.c diff --git a/144_binary_tree_preorder_traversal/Makefile b/144_binary_tree_preorder_traversal/Makefile new file mode 100644 index 0000000..f08c087 --- /dev/null +++ b/144_binary_tree_preorder_traversal/Makefile @@ -0,0 +1,2 @@ +all: + gcc -O2 -o test bst_preorder.c diff --git a/144_binary_tree_preorder_traversal/bst_preorder.c b/144_binary_tree_preorder_traversal/bst_preorder.c new file mode 100644 index 0000000..14e3f56 --- /dev/null +++ b/144_binary_tree_preorder_traversal/bst_preorder.c @@ -0,0 +1,61 @@ +#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(). + **/ +static int* preorderTraversal(struct TreeNode* root, int* returnSize) { + if (root == NULL) { + return NULL; + } + + int cap = 10000, count = 0; + int *results = malloc(cap * sizeof(int)); + struct TreeNode **stack = malloc(cap / 16 * sizeof(*stack)); + struct TreeNode **top = stack; + struct TreeNode *node = root; + + while (node != NULL || top != stack) { + if (node == NULL) { + node = *--top; + } + + results[count++] = node->val; + if (node->right != NULL) { + *top++ = node->right; + } + node = node->left; + } + + *returnSize = count; + return results; +} + +int main(int argc, char **argv) +{ + struct TreeNode root, node1, node2; + root.val = 1; + node1.val = 2; + node2.val = 3; + root.left = NULL; + root.right = &node1; + node1.left = &node2; + node1.right = NULL; + node2.left = NULL; + node2.right = NULL; + + int i, count = 0; + int *results = preorderTraversal(&root, &count); + for (i = 0; i < count; i++) { + printf("%d ", results[i]); + } + printf("\n"); + return 0; +}