Leetcode刷题营第二十九,三十题:二叉树的中序以及后序遍历
94.二叉树的中序遍历
给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3] 输出:[1,3,2]
示例 2:
输入:root = [] 输出:[]
示例 3:
输入:root = [1] 输出:[1]
提示:
- 树中节点数目在范围
[0, 100]
内 -100 <= Node.val <= 100
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
思路:类似于我们之前讲过的递归算法中序遍历二叉树:二叉树的遍历
这里我们需要返回的是数组,数组中的元素是按照中序遍历的顺序,同时返回数组的大小,也就意味着我们需要先计算二叉树的大小,该方法我们在二叉树的遍历中同样也实现了
代码实现:
int TreeSize(struct TreeNode* root){if(!root){return 0;}return 1+TreeSize(root->left)+TreeSize(root->right); }void Inorder(struct TreeNode* root,int*arr,int* index){if(!root){return;}Inorder(root->left,arr,index);arr[*index]=root->val;(*index)++;Inorder(root->right,arr,index); }int* inorderTraversal(struct TreeNode* root, int* returnSize){if(!root){* returnSize = 0;return NULL;} int size = TreeSize(root);* returnSize = size;int* arr = (int*)malloc(sizeof(int)*size);int index = 0;Inorder(root,arr,&index);return arr; }
145. 二叉树的后序遍历
145. 二叉树的后序遍历
给你一棵二叉树的根节点 root
,返回其节点值的 后序遍历 。
示例 1:
输入:root = [1,null,2,3]
输出:[3,2,1]
解释:
示例 2:
输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]
输出:[4,6,7,5,2,9,8,3,1]
解释:
示例 3:
输入:root = []
输出:[]
示例 4:
输入:root = [1]
输出:[1]
提示:
- 树中节点的数目在范围
[0, 100]
内 -100 <= Node.val <= 100
算法思路:与我们的中序遍历一样:思路同样参考二叉树的遍历
代码实现如下:
int TreeSize(struct TreeNode* root){if(!root){return 0;}return 1+TreeSize(root->left)+TreeSize(root->right); }void PostOrder(struct TreeNode* root,int*arr,int* index){if(!root){return;}PostOrder(root->left,arr,index);PostOrder(root->right,arr,index);arr[*index]=root->val;(*index)++; }int* postorderTraversal(struct TreeNode* root, int* returnSize){if(!root){* returnSize = 0;return NULL;} int size = TreeSize(root);* returnSize = size;int* arr = (int*)malloc(sizeof(int)*size);int index = 0;PostOrder(root,arr,&index);return arr; }
好了,本期关于二叉树的遍历就到这里结束了,相信大家对于二叉树的遍历已经十分得心应手了,这里递归的思想非常重要,但是对于那些比较大的树,深树,递归的方式往往容易栈溢出。我们会采取迭代加栈与队列以及层序的方式来完成--这些内容会留到c++部分进行讲解。谢谢大家的点赞和收藏!!