深度优先搜索(DFS, Depth First Search)是一个针对图和树的遍历算法。
对于二叉树,深度优先遍历有前序,中序,和后序三种遍历方式。
- 前序遍历:根左右。先打印,再遍历左子树,再遍历右子树;
- 中序遍历:左根右。先遍历左子树,再打印,再遍历右子树;
- 后序遍历:左右根。先遍历左子树,再遍历右子树,再打印。
1.前序遍历
1.图解如下:
2.源代码:
//先求出树的高度以便申请数组空间大小。
int size(struct TreeNode* root) {
if (root == NULL)
return 0;
return 1 + size(root->left) + size(root->right);
}
//对二叉树的前序遍历
void PreorderTraversal(struct TreeNode* root, int* a, int* i)
{
if (root == NULL)
return;
a[(*i)++] = root->val;
PreorderTraversal(root->left, a, i);
PreorderTraversal(root->right, a, i);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
int size_1 = size(root);
//申请size长度的数组大小。
int* a = (int*)malloc(sizeof(int) * size_1);
int i = 0;
PreorderTraversal(root, a, &i);
*returnSize = i;
return a;
}
2.中序遍历
1.图解如下:
2.源代码:
//求二叉树结点个数
int Treesize(struct TreeNode*root)
{
if(root==NULL)
return 0;
return 1+Treesize(root->left)+Treesize(root->right);
}
//二叉树中序遍历
void InorderTraversal(struct TreeNode* root,int *a,int *i)
{
if(root==NULL)
return;
InorderTraversal(root->left,a,i);
a[(*i)++]=root->val;
InorderTraversal(root->right,a,i);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
int size=Treesize(root);
int *a=(int*)malloc(sizeof(int)*size);
int i=0;
InorderTraversal(root,a,&i);//&i免得递归是i发生错误
*returnSize=i;
return a;
}
3.后序遍历
1.图解如下:
2.源代码:
//求二叉树节点数,申请数组空间用
int Treesize(struct TreeNode*root)
{
if(root==NULL)
return 0;
return 1+Treesize(root->left)+Treesize(root->right);
}
//后序遍历
void PostorderTraversal(struct TreeNode* root,int *a,int *i)
{
if(root==NULL)
return;
PostorderTraversal(root->left,a,i);
PostorderTraversal(root->right,a,i);
a[(*i)++]=root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize){
int size=Treesize(root);
int *a=(int*)malloc(sizeof(int)*size);
int i=0;
PostorderTraversal(root,a,&i);
*returnSize=i;
return a;
}
4.三种遍历总结
三种遍历都是采用递归的思想实现。总体思路如下:
1.求树的结点个数(为申请数组空间)。
2.遍历的递归函数,代码一样,只是数组位置有点差异。以下是递归思想核心代码。
void PostorderTraversal(struct TreeNode* root,int *a,int *i)
{
if(root==NULL)
return;
PostorderTraversal(root->left,a,i);
PostorderTraversal(root->right,a,i);
a[(*i)++]=root->val;
}
3.遍历的主要函数,通过对上面两个函数的调用实现遍历。