数据结构之二叉树的基础OJ练习二叉树的遍历

Posted 小赵小赵福星高照~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之二叉树的基础OJ练习二叉树的遍历相关的知识,希望对你有一定的参考价值。

二叉树的前序遍历

题目来源:二叉树的前序遍历

题目描述:

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

解题思路:

规则是若二叉树为空,则空操作返回,否则先访问根节点,然后前序遍历左子树,然后再前序遍历右子树。可以利用递归实现

代码如下:

因为题目要求我们返回前序遍历的结果,故我们需要开辟一个数组来保存前序遍历的结果,但是开辟时我们不知道数组的大小,故我们可以再写一个计算二叉树节点个数的函数,这样就明确了开辟的空间,然后我们写一个前序遍历的函数,只不过我们的这个前序遍历访问节点的方式变成了将当前节点的值赋给数组,最后返回该数组即可

int TreeSize(struct TreeNode* root)
{
    if(root==NULL)
        return 0;
    return TreeSize(root->left)+TreeSize(root->right)+1;
}
void _preorderTraversal(struct TreeNode* root,int arr[],int* pi)
{
    //每个递归调用栈帧中都有一个i,下一层i++,不会对上一层的i有影响,故要传地址
    if(root==NULL)
    	return ;
    arr[(*pi)++]=root->val;
    _preorderTraversal(root->left,arr,&i);
    _preorderTraversal(root->right,arr,&i);
    
}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    *returnSize = TreeSize(root);
	int *a = malloc(sizeof(int)*(*returnSize));
    int i=0;
    _preorderTraversal(root,a,&i);
    return arr;
}

二叉树的中序遍历

题目来源:

二叉树的中序遍历

题目描述:

给定一个二叉树的根节点 root ,返回它的 中序 遍历。

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

中序遍历和前序遍历是一样的,代码也直接将访问节点改在了先访问左子树后面,故就不说思路了,直接贴代码:

代码如下:

int TreeSize(struct TreeNode* root)
{
    if(root==NULL)
        return 0;
    return TreeSize(root->left)+TreeSize(root->right)+1;
}
void _preorderTraversal(struct TreeNode* root,int arr[],int* pi)
{
    //每个递归调用栈帧中都有一个i,下一层i++,不会对上一层的i有影响,故要传地址
    if(root==NULL)
    	return ;
    
    _preorderTraversal(root->left,arr,&i);
    arr[(*pi)++]=root->val;
    _preorderTraversal(root->right,arr,&i);
    
}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    *returnSize = TreeSize(root);
	int *a = malloc(sizeof(int)*(*returnSize));
    int i=0;
    _preorderTraversal(root,a,&i);
    return arr;
}

二叉树的后序遍历

题目来源:

二叉树的后序遍历

题目描述:

给定一个二叉树,返回它的 后序 遍历。

示例:

输入: [1,null,2,3]  
   1
    \\
     2
    /
   3 

输出: [3,2,1]

后序遍历和前面两个遍历是一样的,代码也直接将访问节点改在了先访问左子树和右子树后面,故就不说思路了,直接贴代码:

代码如下:

int TreeSize(struct TreeNode* root)
{
    if(root==NULL)
        return 0;
    return TreeSize(root->left)+TreeSize(root->right)+1;
}
void _preorderTraversal(struct TreeNode* root,int arr[],int* pi)
{
    //每个递归调用栈帧中都有一个i,下一层i++,不会对上一层的i有影响,故要传地址
    if(root==NULL)
    	return ;
    
    _preorderTraversal(root->left,arr,&i);
    _preorderTraversal(root->right,arr,&i);
    arr[(*pi)++]=root->val;
    
}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    *returnSize = TreeSize(root);
	int *a = malloc(sizeof(int)*(*returnSize));
    int i=0;
    _preorderTraversal(root,a,&i);
    return arr;
}

以上是关于数据结构之二叉树的基础OJ练习二叉树的遍历的主要内容,如果未能解决你的问题,请参考以下文章

数据结构二叉树经典OJ练习

数据结构之二叉树基础OJ练习检查两颗树是否相同

数据结构之二叉树的实现

Day6:数据结构之二叉树

数据结构——二叉树的基础练习题(单值二叉树,翻转二叉树,相同的树,对称二叉树,另一颗子树,二叉树的前序遍历)

数据结构实验之二叉树八:(中序后序)求二叉树的深度