LeetCode 二叉树的中序遍历(递归和非递归算法)
程序员文章站
2022-06-17 17:38:04
...
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
思路分析:二叉树的遍历有先序遍历、中序遍历、后序遍历、层次遍历。
先序遍历:先访问根节点,然后访问左子树,再访问右子树。
中序遍历:先访问左子树,然后访问根节点,再访问右子树。
后序遍历:先访问左子树,然后访问右子树,再访问根节点。
层次遍历:从数的根部按照深度从小到大访问每一层,每层访问从左至右。
方法一:递归算法实现。此法比较好理解。
/**
* 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> result;
void myInorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
//先遍历左子树
if (root->left != NULL) {
myInorderTraversal(root->left);
}
//遍历当前根节点
result.push_back(root->val);
//再遍历右子树
if (root->right != NULL) {
myInorderTraversal(root->right);
}
}
vector<int> inorderTraversal(TreeNode* root) {
myInorderTraversal(root);//中序遍历
return result;
}
};
方法二:非递归算法。借助栈的辅助进行访问。
/**
* 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> result;
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> myStack;//辅助栈,由于保护现场
while (!myStack.empty() || root != NULL) {
if (root != NULL && root->left != NULL) {//如果左子树不为空
myStack.push(root);//保护现场
root = root->left;//先访问左子树
continue;
}
if (root == NULL) {
if (!myStack.empty()) {
root = myStack.top();//恢复现场
myStack.pop();
}
else {
break;
}
}
result.push_back(root->val);//访问当前跟节点
root = root->right;//访问右子树
}
return result;
}
};
下一篇: 基于@Table注解无法使用及报红的解决
推荐阅读
-
[PHP] 算法-根据前序和中序遍历结果重建二叉树的PHP实现
-
【算法】二叉树的前序、中序、后序、层序遍历和还原。
-
PHP基于非递归算法实现先序、中序及后序遍历二叉树操作示例
-
剑指 Offer 07. 重建二叉树——【前中序】和【中后序】重建二叉树的递归思路详解
-
C二叉树前序遍历中序遍历后续遍历递归非递归
-
二叉树遍历 前序遍历 后序遍历 中序遍历 非递归前序遍历 二叉树遍历非递归
-
【LeetCode】二叉树各种遍历大汇总(秒杀前序、中序、后序、层序)递归 & 迭代
-
左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)
-
c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)
-
C++ 非递归实现二叉树的前中后序遍历