二叉树的深度优先遍历-(前序,中序,后序)

深度优先搜索(DFS, Depth First Search)是一个针对图和树的遍历算法。
对于二叉树,深度优先遍历有前序,中序,和后序三种遍历方式。

  • 前序遍历:根左右。先打印,再遍历左子树,再遍历右子树;
  • 中序遍历:左根右。先遍历左子树,再打印,再遍历右子树;
  • 后序遍历:左右根。先遍历左子树,再遍历右子树,再打印。

1.前序遍历

LeetCode144. 二叉树的前序遍历链接入口

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.中序遍历

LeetCode94. 二叉树的中序遍历链接入口

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.后序遍历

LeetCode145. 二叉树的中序遍历链接入口

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.遍历的主要函数,通过对上面两个函数的调用实现遍历。

猜你喜欢

转载自blog.csdn.net/weixin_45313447/article/details/112879820