考察内容:二叉树,中序遍历,递归
时间:2020-09-05 星期五
作者:guuzaa
掘金主页:🌏
题目描述 📃
题目链接 🔗,题目来自 lintcode 67题,二叉树的中序遍历。
中序遍历是遍历二叉树的一种方式。
首先中序遍历左子树,然后访问根节点,最后中序遍历右子树。因为根在中间遍历,故称为
中序遍历
分析 💻
递归解法
递归解法特别好写,因为中序遍历就是通过递归定义的。递归体就是先中序遍历左子树,然后访问根节点,最后中序遍历右子树;递归出口也很容易想到,当根节点为空的时候,返回上层调用。
C++ 代码
vector<int> inorderTraversal(TreeNode *root) {
vector<int> res;
if (root == nullptr) return res;
// 遍历左子树
auto left = inorderTraversal(root->left);
res.insert(res.end(), left.begin(), left.end());
// 访问根节点
res.push_back(root->val);
// 遍历右子树
auto right = inorderTraversal(root-right);
res.insert(res.end(),right.begin(), right.end());
return res;
}
迭代解法
那么中序遍历怎么用迭代实现呢?
首先我们用栈模拟函数调用栈,不停遍历树的左子树根节点并把它放入栈中。当左子树为空时,访问根节点。如果右子树非空,那么遍历右子树。按照上面的步骤不停迭代,直到栈空或者工作指针为空。root 充当工作指针的角色,代码实现如下:
C++ 解法
vector<int> inorderTraversal(TreeNode * root) {
vector<int> res;
stack<TreeNode*> tool;
while(root || !tool.empty()) {
while(root) {
tool.push(root);
root = root->left;
}
auto item = tool.top();
tool.pop(); // 实名吐槽 C++好麻烦 pop就弹出栈顶元素,返回void
res.push_back(item->val);
if (item->right) root = item->right;
}
return res;
}
Python 代码
def inorderTraversal(self, root):
res, stack = [], []
while root or stack:
while root:
stack.append(root)
root = root.left
top = stack.pop()
res.append(top.val)
if top.right:
root = top.right
return res
总结 📕:
- 非递归实现我想了好久,才想出怎样写。
- C++ 弹出栈顶元素太麻烦!!
- 时空复杂度还不太会分析
全文完