二叉树链式结构的遍历
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。根据访问结点操作发生位置分别命名为前序/中序/后序的递归结构遍历。
- NLR:前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
- LNR:中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
- LRN:后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。
由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。
代码实现如下:
#include <stdio.h>
#include <assert.h>
#include <malloc.h>
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int TreeSize(struct TreeNode* root)
{
if (root == NULL)
return 0;
return TreeSize(root->left) + TreeSize(root->right) + 1;
}
//二叉树的前序遍历
void _preorderTraversal(struct TreeNode* root, int* preorder, int* pindex)
{
if (root == NULL)
return;
preorder[*pindex] = root->val;
++(*pindex);
_preorderTraversal(root->left, preorder, pindex);
_preorderTraversal(root->right, preorder, pindex);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
*returnSize = TreeSize(root);
int* preorder = (int*)malloc(*returnSize * sizeof(int));
int index = 0;
_preorderTraversal(root, preorder, &index);
return preorder;
}
//二叉树的中序遍历
void _inorderTraversal(struct TreeNode* root, int* inorder, int* pindex)
{
if (root == NULL)
return;
_inorderTraversal(root->left, inorder, pindex);
inorder[*pindex] = root->val;
(*pindex)++;
_inorderTraversal(root->right, inorder, pindex);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
*returnSize = TreeSize(root);
int* inorder = (int*)malloc(*returnSize * sizeof(int));
int index = 0;
_inorderTraversal(root, inorder, &index);
return inorder;
}
//二叉树的后序遍历
void _postorderTraversal(struct TreeNode* root, int* postorder, int* pindex)
{
if (root == NULL)
return;
_postorderTraversal(root->left, postorder, pindex);
_postorderTraversal(root->right, postorder, pindex);
postorder[*pindex] = root->val;
(*pindex)++;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize){
*returnSize = TreeSize(root);
int* postorder = (int*)malloc(*returnSize * sizeof(int));
int index = 0;
_postorderTraversal(root, postorder, &index);
return postorder;
}