题目链接:leetcode144
题面
题目大意
略
解题思路
大致方法有递归、利用栈实现非递归以及Morris遍历,对于Morris遍历可以看这篇文章 传送门。
其中递归和非递归栈空间复杂度都是 O ( log 2 n ) O(\log_2n) O(log2n) ,Morris 遍历空间复杂度为 O ( 1 ) O(1) O(1) 。
代码实现
Morris 遍历
/**
* 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> preorderTraversal(TreeNode* root) {
vector<int> res; res.clear();
if (root == NULL) return res;
TreeNode *p, *cur = root;
while (cur) {
p = cur->left;
if (p) {
while (p->right && p->right != cur) p = p->right;
if (p->right == NULL) {
p->right = cur;
res.push_back(cur->val);
cur = cur->left;
continue;
} else {
p->right = NULL;
}
} else {
res.push_back(cur->val);
}
cur = cur->right;
}
return res;
}
};
非递归栈(法一)
/**
* 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> preorderTraversal(TreeNode* root) {
vector<int> res; res.clear();
if (root == NULL) return res;
TreeNode *cur = root;
stack<TreeNode*> stk; while(!stk.empty()) stk.pop();
if (root->left) stk.push(root);
while (cur) {
res.push_back(cur->val);
if (cur->left) {
cur = cur->left;
} else if (cur->right){
cur = cur->right;
} else {
cur = NULL;
while (!stk.empty() && !cur) {
cur = stk.top()->right;
stk.pop();
}
}
if (cur && cur->left) stk.push(cur);
}
return res;
}
};
非递归栈(法二)
/**
* 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> preorderTraversal(TreeNode* root) {
vector<int> res; res.clear();
stack<TreeNode*> stk; while(!stk.empty()) stk.pop();
TreeNode *cur = root;
while (cur || !stk.empty()) {
if (cur) {
res.push_back(cur->val);
stk.push(cur);
cur = cur->left;
} else {
cur = stk.top()->right;
stk.pop();
}
}
return res;
}
};
总结
非递归+栈:当前结点可以到达空结点的方法逻辑比较简单。