题目描述
给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3] 输出:[1,3,2]
示例 2:
输入:root = [] 输出:[]
示例 3:
输入:root = [1] 输出:[1]
提示:
- 树中节点数目在范围
[0, 100]
内 -100 <= Node.val <= 100
解法一:递归法
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
//递归法:
void inOrderTravel(struct TreeNode* root, int* ans, int* returnSize)
{
if(root==NULL) //若当前遍历结点为空则返回
{
return;
}
//左
inOrderTravel(root->left,ans,returnSize);
//根
ans[(*returnSize)++]=root->val;
//右
inOrderTravel(root->right,ans,returnSize);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize)
{
int* ans = (int*)malloc(sizeof(int)*101);
*returnSize = 0;
if(root==NULL)
return returnSize;
inOrderTravel(root,ans,returnSize);
return ans;
}
解法二:迭代算法
关键点:
1:树的中序遍历口诀:左根右
2:迭代法,需要需要借助栈来实现操作先后操作
3:利用栈的操作原理,先进后出的原理。
时间复杂度:O(n)
空间复杂度: O(1)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
//迭代法:
int* inorderTraversal(struct TreeNode* root, int* returnSize)
{
//创建一个返回数组
int* ans=(int*)malloc(sizeof(int)*101);
*returnSize = 0; //初始化给予的变量
if(root==NULL) //若为空树则直接返回空
return returnSize;
//创建栈用于非递归中序遍历
struct TreeNode* stack[101];
struct TreeNode* node = root; //遍历二叉树指针
int top=0; //栈顶指针
//开始遍历
while(top>0 || node !=NULL)
{
while(node!=NULL) //将该结点所有左子树都放入栈中
{
stack[top++]=node;
node=node->left;
}
node=stack[--top]; //注意这里是--top而不能是top--,因为上一次入栈完已经++了,现在top指向空
ans[(*returnSize)++]=node->val;
node=node->right;
}
return ans;
}
笔记:
1.若题目给出的条件不足以构建新数组之类的可以自己建立自己需要的条件,如递归法中将int*型的returnSize解引用成int型数据再将其作为答案数组的遍历指针
2.迭代算法:从某个值开始,不断地由上一步的结果计算(或推断)出下一步的结果,就叫迭代算法。
该题使用了栈来实现非递归的迭代算法.
3.复习普通二叉树相关算法:普通二叉树的相关算法-CSDN博客