前序遍历
/****************************************************************
* 二叉树系列 前序遍历
* 先访问根节点,再访问左子树,最后访问右子树
*****************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/**
* Definition for a binary tree node.
**/
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int GetTreeSize(struct TreeNode *root)
{
int leftSum = 0, rightSum = 0;
if (root == NULL) return 0;
leftSum = GetTreeSize(root->left);
rightSum = GetTreeSize(root->right);
return leftSum + rightSum + 1;
}
void preOrderGetNode(struct TreeNode * root, int *array, int *index)
{
if (root == NULL) return;
array[*index] = root->val;
*index += 1;
preOrderGetNode(root->left, array, index);
preOrderGetNode(root->right, array, index);
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
int *array;
int index = 0;
*returnSize = GetTreeSize(root);
array = (int *)malloc(*returnSize * sizeof(int));
preOrderGetNode(root, array, &index);
return array;
}
中序遍历
/****************************************************************
* 二叉树系列 中序遍历
* 先访问左子树,再访问根节点,最后访问右子树
*****************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/**
* Definition for a binary tree node.
**/
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int GetTreeSize(struct TreeNode *root)
{
int leftSum = 0, rightSum = 0;
if (root == NULL) return 0;
leftSum = GetTreeSize(root->left);
rightSum = GetTreeSize(root->right);
return leftSum + rightSum + 1;
}
void inOrderGetNode(struct TreeNode * root, int *array, int *index)
{
if (root == NULL) return;
inOrderGetNode(root->left, array, index);
array[*index] = root->val;
*index += 1;
inOrderGetNode(root->right, array, index);
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* inorderTraversal(struct TreeNode* root, int* returnSize)
{
int *array;
int index = 0;
*returnSize = GetTreeSize(root);
array = (int *)malloc(*returnSize * sizeof(int));
inOrderGetNode(root, array, &index);
return array;
}
后序遍历
/****************************************************************
* 二叉树系列 后序遍历
* 先访问左子树,再访问右子树,最后访问根节点
*****************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/**
* Definition for a binary tree node.
**/
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int GetTreeSize(struct TreeNode *root)
{
int leftSum = 0, rightSum = 0;
if (root == NULL) return 0;
leftSum = GetTreeSize(root->left);
rightSum = GetTreeSize(root->right);
return leftSum + rightSum + 1;
}
void postOrderGetNode(struct TreeNode * root, int *array, int *index)
{
if (root == NULL) return;
postOrderGetNode(root->left, array, index);
postOrderGetNode(root->right, array, index);
array[*index] = root->val;
*index += 1;
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* postorderTraversal(struct TreeNode* root, int* returnSize)
{
int *array;
int index = 0;
*returnSize = GetTreeSize(root);
array = (int *)malloc(*returnSize * sizeof(int));
postOrderGetNode(root, array, &index);
return array;
}
小结
使用递归方案,三种遍历方式实现差异仅仅是递归函数中的节点保存位置存在不同,代码较简洁。