二叉树的遍历(OJ)

二叉树的遍历

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-preorder-traversal/description/

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-inorder-traversal/description/
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-postorder-traversal/description/

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

二叉树的遍历(OJ)_第1张图片

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

二叉树的遍历(OJ)_第2张图片

输入:root = [1,2]
输出:[1,2]

示例 5:

二叉树的遍历(OJ)_第3张图片

输入:root = [1,null,2]
输出:[1,2]

输出结果在数组中。

所以:

第一步是统计树中的结点个数。

有了个数之后才能为数组动态申请空间。

之后就是将根节点指向的值,存放到数组中。

最核心的还是递归,遍历树。

前序,中序,后序,大部分过程是一样的。

唯一不同的是递归的方式。(上一篇中有详细简绍)。 

int TreeSize(struct TreeNode* root){
     return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
 }
 void _preorderTraversal(struct TreeNode* root, int* a,int*pi){
     if(root==NULL){
         return;
     }
     a[*pi]=root->val;
     ++(*pi);
     _preorderTraversal(root->left,a,pi);
     _preorderTraversal(root->right,a,pi);
 }
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    int size=TreeSize(root);
    int *a=(int*)malloc(sizeof(int)*size);
    int i=0;
    _preorderTraversal(root,a,&i);
    * returnSize=size;
    return a;
}
int TreeSize(struct TreeNode* root){
     return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
 }
 void _inorderTraversal(struct TreeNode* root, int* a,int*pi){
     if(root==NULL){
         return;
     }
     _inorderTraversal(root->left,a,pi);
     a[*pi]=root->val;
     ++(*pi);
     _inorderTraversal(root->right,a,pi);
 }
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);
    * returnSize=size;
    return a;
}
int TreeSize(struct TreeNode* root){
    return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
}
void _postorderTraversal(struct TreeNode* root, int* a,int* pi){
    if(root==NULL){
        return;
    }
    _postorderTraversal(root->left,a,pi);
    _postorderTraversal(root->right,a,pi);
    a[*pi]=root->val;
    (*pi)++;
}
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=size;
    return a;
}

你可能感兴趣的:(数据结构,c语言,算法)