题目描述及要求
代码
1.递归法
本方法采用递归的方式对树进行遍历,值得注意的是,在递归左右子树时,形参val_count已是指针类型,不必再在前加&取地址
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void Traversal(struct TreeNode* T, int* buffer, int *val_count)
{
if(!T) //如果结点为空则返回
return;
buffer[(*val_count)++] = T->val; //存储树中的值并使val_count自增
Traversal(T->left, buffer, val_count); //递归左子树
Traversal(T->right, buffer, val_count); //递归右子树
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
int* buffer = (int*)malloc(sizeof(int)*512);
int val_count = 0;
memset(buffer, 0, sizeof(int)*512);
Traversal(root, buffer, &val_count);
*returnSize = val_count; //记录树的结点个数
return buffer;
}
2.迭代法
本法使用数组模拟堆栈的方法 (参考:利用数组模拟栈的操作,完成迭代算法的实现。)
这种方法较为简单地实现了迭代,右子树先判断是为了出栈时保证左子树先被输出。
int *preorderTraversal(struct TreeNode *root, int *returnSize)
{
int *res = (int *)malloc(sizeof(int) * 100), top = -1;
struct TreeNode **stack = (struct TreeNode **)malloc(sizeof(struct TreeNode *) * 100);
*returnSize = 0;
if (!root)
return NULL;
stack[++top] = root;
while (top != -1)
{
root = stack[top--]; //出栈
res[(*returnSize)++] = root->val; //取树中结点的值
if (root->right) //右子树进栈
{
stack[++top] = root->right;
}
if (root->left) //左子树进栈
{
stack[++top] = root->left;
}
}
return res;
}