树的结构
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
中序遍历
- 非递归遍历
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> ans;
TreeNode* curr = root;
while(root || !s.empty()){
while(root){
s.push(root);
root = root->left;
}
root = s.top();s.pop();
cout << root->val << ednl;
root = root->right;
}
return ans;
}
};
- 在之前的版本中加入记录第个结点的深度。
思想:如果当前结点是右孩子,那么在这个结点之前加入一个nullptr占位,这样,栈深就是当前结点的深度了。。
手动模拟下,可以发现中序遍历下保存的结点都是左孩子,而在当前结点的某一个祖先为右孩子时,它不会入栈。。所以使用一个空指针来占位。
版权@djl orz
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> ans;
TreeNode* curr = root;
int level = 0;
bool flag = false;
while(!s.empty() || curr){
while(curr){
if(flag){
s.push(nullptr);
}
flag = false;
s.push(curr);
curr = curr->left;
}
do{
curr = s.top();s.pop();
}while(!s.empty() && curr == nullptr);
if(s.empty() && curr == nullptr){
break;
}
// cout << curr->val << endl;
ans.push_back(curr->val);
curr = curr->right;
if(curr != nullptr)
flag = true;
}
return ans;
}
};
坑:前序,后序的非递归,以及保存深度下的做法(不一定会写)