This commit is contained in:
youngyangyang04
2021-07-26 11:18:29 +08:00
parent bafa3da280
commit f1b862c814
10 changed files with 490 additions and 74 deletions

View File

@@ -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;
}
};
```
在实现迭代法的过程中,有同学问了:递归与迭代究竟谁优谁劣呢?