一.递归
二叉树的中序遍历过程为先遍历左子树,再访问根节点,最后遍历右子树
- 首先访问根节点7的左子树,访问节点3,3没有左子树,则访问右子树5
- 根节点的左子树遍历完,访问根节点
- 最后访问根节点的右子树2,访问2的左子树1,1没有左右子树,返回2,访问2的右子树,为空返回节点
- 因此中序遍历为:3->5->7->1->2
C语言:
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int GetSize(struct TreeNode* root)
{
if(root==NULL)
return 0;
return GetSize(root->left)+GetSize(root->right)+1;
}
void _inorderTraversal(struct TreeNode* root,int* array,int* index)
{
if(root==NULL)
return 0;
_inorderTraversal(root->left,array,index);
array[(*index)++]=root->val;
_inorderTraversal(root->right,array,index);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize) {
*returnSize=GetSize(root); //计算二叉树的节点个数
int* array=(int*)malloc(sizeof(int)*(*returnSize));
int index=0;
_inorderTraversal(root,array,&index);
return array;
}
C++:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
vector<int> v;
vector<int> inorderTraversal(TreeNode* root) {
if(root==NULL)
return v;
inorderTraversal(root->left);
v.push_back(root->val);
inorderTraversal(root->right);
return v;
}
};
二.非递归
//利用栈结构
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> v;
stack<TreeNode*> s;
TreeNode* cur=root;
while(cur||!s.empty())
{
if(cur)
{
s.push(cur); //如果cur不为空,入栈
cur=cur->left;
}
else
{
cur=s.top(); //当cur为空,cur为栈顶元素
v.push_back(cur->val); //cur的左子树为空,将cur的值尾插进vector
s.pop();
cur=cur->right;
}
}
return v;
}
};