给定一个二叉树,返回它的中序遍历。中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历、中序周游。在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。
示例:
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
解法一:使用递归算法
class Solution {
public:
void fun(TreeNode* root, vector<int>& men) # 中序遍历递归函数
{
if(root->left==NULL && root->right==NULL) # 如果该点的左右子节点都为空,那么直接存储该结点
men.push_back(root->val);
else if(root->left==NULL && root->right!=NULL) # 如果该点的左子节点为空,右子节点不为空
{
men.push_back(root->val); # 将该节点存储
fun(root->right,men); # 在对右子节点进行递归运算
}
else if(root->left!=NULL && root->right==NULL) # 如果右子节点为空
{
fun(root->left,men); # 先对左子节点进行递归运算
men.push_back(root->val); # 再存储该结点
}
else # 如果左右子节点都不为空
{
fun(root->left,men); # 先对左子节点进行递归运算
men.push_back(root->val); # 存储该结点值
fun(root->right,men); # 对右子节点进行递归运算
}
}
vector<int> inorderTraversal(TreeNode* root) {
if(root==NULL) # 如果初始点值为空,直接返回空vector
return {};
vector<int> men; # 建立一个容器用于存储二叉树的中序遍历值,初始为空
fun(root,men); # 递归函数
return men; # 返回存储的中序遍历值
}
};
解法二:使用迭代算法
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> vec; # 用于存放二叉树进行中序遍历后的值
stack<TreeNode*> stk; # 用于存放结点
if(root == NULL) # 如果初始结点为空,直接返回空
return {};
TreeNode* r = root; # 新建一个TreeNode*,存储root初始值
while(!stk.empty()||r!=NULL) # 如果堆栈不为空,同时当前结点不为NULL
{
while(r!=NULL) # 如果当前结点不为NULL
{
stk.push(r); # 将当前结点存进堆栈中
r = r->left; # 迭代至当前结点的左子树
}
r = stk.top(); # 当当前结点为NULL时,找到堆栈中top对应的结点值
stk.pop(); # 弹出top的结点值,因为不需要了
vec.push_back(r->val); # 将结点结构中的val值存进vec中,迭代该节点的右子树
r = r->right;
}
return vec;
}
};