题目:. - 力扣(LeetCode)
注意:以下代码均为个人尝试编写,并非力扣题解,因此时间和空间复杂度可能并不是最优的,只是记录一下自己当时写这个题的时候的思路;
前序遍历:
/**
* 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> result;
stack<TreeNode*> my_stack;
TreeNode* ptr = root;
//剪枝1:
if(root == nullptr) return result;
//先将根节点装进栈中,否则无法进入下面的 while 循环
my_stack.push(ptr);
//思路:把每个取出来的节点都当作一个子树的根节点,然后对这个子树进行前序遍历;
// 对于这个子树而言,首先沿着左侧一路遍历到最底部,所有遇到的右侧节点全部装进栈中,稍后进行遍历;
// 当遍历完一个子树的左半部分之后,开始从栈中取出右侧元素,把他们当作新的子树的根节点,从新进行只遍历左侧的操作;
while(my_stack.size() != 0) {
//获得指向 “新子树的根节点” 的指针
ptr = my_stack.top();
my_stack.pop();
//沿新子树的左侧一直遍历到最底部,则停止遍历
while(ptr->left != nullptr || ptr->right != nullptr) {
result.push_back(ptr->val);
if(ptr->left != nullptr && ptr->right != nullptr) {
my_stack.push(ptr->right);
ptr = ptr->left;
}
else if(ptr->left != nullptr && ptr->right == nullptr) {
ptr = ptr->left;
}
else if(ptr->left == nullptr && ptr->right != nullptr) {
my_stack.push(ptr->right);
break;
}
else break;
}
//剪枝2:针对测试用例3,因为在测试用例3的情况下无法进入 while 循环
//剪枝3:针对测试用例1,因为当 ptr 在新的一轮循环中指向叶节点的时候,是无法进入 while 循环的,所以只能在外面加;
if(ptr->left == nullptr && ptr->right == nullptr) result.push_back(ptr->val);
}
return result;
}
};