mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2026-02-02 18:39:09 +08:00
Update
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
|
||||
对于二叉树节点的定义,C++代码如下:
|
||||
|
||||
```
|
||||
```C++
|
||||
struct TreeNode {
|
||||
int val;
|
||||
TreeNode *left;
|
||||
@@ -35,7 +35,7 @@ TreeNode* a = new TreeNode(9);
|
||||
|
||||
没有构造函数的话就要这么写:
|
||||
|
||||
```
|
||||
```C++
|
||||
TreeNode* a = new TreeNode();
|
||||
a->val = 9;
|
||||
a->left = NULL;
|
||||
@@ -60,11 +60,35 @@ morris遍历是二叉树遍历算法的超强进阶算法,morris遍历可以
|
||||
|
||||
在[二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/c_zCrGHIVlBjUH_hJtghCg)中我们开始用栈来实现递归的写法,也就是所谓的迭代法。
|
||||
|
||||
细心的同学发现文中前后序遍历空节点是入栈的,其实空节点入不入栈都差不多,但感觉空节点不入栈确实清晰一些,符合文中动画的演示。
|
||||
细心的同学发现文中前后序遍历空节点是否入栈写法是不同的
|
||||
|
||||
前序遍历空节点不入栈的代码:(注意注释部分,和文章中的区别)
|
||||
其实空节点入不入栈都差不多,但感觉空节点不入栈确实清晰一些,符合文中动画的演示。
|
||||
|
||||
拿前序遍历来举例,空节点入栈:
|
||||
|
||||
```C++
|
||||
class Solution {
|
||||
public:
|
||||
vector<int> preorderTraversal(TreeNode* root) {
|
||||
stack<TreeNode*> st;
|
||||
vector<int> result;
|
||||
st.push(root);
|
||||
while (!st.empty()) {
|
||||
TreeNode* node = st.top(); // 中
|
||||
st.pop();
|
||||
if (node != NULL) result.push_back(node->val);
|
||||
else continue;
|
||||
st.push(node->right); // 右
|
||||
st.push(node->left); // 左
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
前序遍历空节点不入栈的代码:(注意注释部分和上文的区别)
|
||||
|
||||
```C++
|
||||
class Solution {
|
||||
public:
|
||||
vector<int> preorderTraversal(TreeNode* root) {
|
||||
@@ -82,32 +106,8 @@ public:
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
```
|
||||
|
||||
后序遍历空节点不入栈的代码:(注意注释部分,和文章中的区别)
|
||||
|
||||
```
|
||||
class Solution {
|
||||
public:
|
||||
vector<int> postorderTraversal(TreeNode* root) {
|
||||
stack<TreeNode*> st;
|
||||
vector<int> result;
|
||||
if (root == NULL) return result;
|
||||
st.push(root);
|
||||
while (!st.empty()) {
|
||||
TreeNode* node = st.top();
|
||||
st.pop();
|
||||
result.push_back(node->val);
|
||||
if (node->left) st.push(node->left); // 相对于前序遍历,这更改一下入栈顺序 (空节点不入栈)
|
||||
if (node->right) st.push(node->right); // 空节点不入栈
|
||||
}
|
||||
reverse(result.begin(), result.end()); // 将结果反转之后就是左右中的顺序了
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
```
|
||||
|
||||
在实现迭代法的过程中,有同学问了:递归与迭代究竟谁优谁劣呢?
|
||||
|
||||
|
||||
Reference in New Issue
Block a user