数据结构|数据结构之二叉树的基础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]
【数据结构|数据结构之二叉树的基础OJ练习二叉树的遍历】代码如下:
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;
}
推荐阅读
- java中如何实现重建二叉树
- 二叉树路径节点关键值和等于目标值(LeetCode--112&LeetCode--113)
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)
- 《数据结构与算法之美》——队列
- 暗能量时代之二
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- Java深入了解数据结构之栈与队列的详解
- Java集合框架|Java集合框架 数据结构
- 数据结构与算法|【算法】力扣第 266场周赛
- 数据结构和算法|LeetCode 的正确使用方式