给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
树一种特殊的图,是连通的,无回路的无向图。
因此,二叉树的搜索也称二叉树的遍历,同样有深度优先遍历和广度优先遍历两种方式。
广度优先遍历也称为层序遍历,遍历原则为:以树的根节点开始,按照树的高度由低到高,一层一层地遍历下去,每一层按照从左至右的顺序遍历,直至到达树的最大深度,遍历完全部节点为止。
深度优先遍历,遍历原则为:从树的根节点开始,沿着左子树进行深度遍历,直到到达叶子节点为止;然后回溯到根节点,进行右子树的深度遍历,直到遍历完所有节点。
具体的,按照根节点相对于子节点的访问顺序,可进一步分为前序遍历、中序遍历和后序遍历。
这里固定左节点和右节点的遍历顺序,那么:
前序(pre-order)指先访问根节点,再遍历左子树和右子树;
中序(in-order)是指先遍历左子树,接着访问根节点,最后遍历右子树;
后序(post-order)是指先遍历左子树,接着遍历右子树,最后访问根节点。
/**
* Definition for a binary tree node.
* 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> ans;
inorder(root, ans);
return ans;
}
void inorder(TreeNode* node, vector<int>& ans) {
if (node == NULL) {
return;
}
inorder(node->left, ans);
ans.push_back(node->val);
inorder(node->right, ans);
}
};
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> stk;
while (root or !stk.empty()) {
while (root != NULL) {
stk.push(root);
root = root->left;
//沿着根节点及左子树这条路径遍历到底,并将节点放入栈中
}
//访问根节点及左子树这条路径上的节点
TreeNode* node = stk.top();
stk.pop();
ans.push_back(node->val);
//按照同样的策略,深度遍历右子树
root = node->right;
}
return ans;
}
};