如果節點左右子節點都為空或者上一次訪問的節點為其左右子節點中的一個,(某些節點可能只有一個子節點,所以 pre 不能為空,然后若只有左子節點,則上一次訪問的為其左子節點;若有左右子節點,按照壓棧順序,則上一次訪問的為其右子節點;)則彈出棧頂節點,將節點數據加入 data,將上一次訪問的節點指向當前節點
否則,如果存在左右子節點,先壓入其右子節點,再壓入其左子節點
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {vector<int> data = {};stack<TreeNode*> node_stack;if (root) node_stack.push(root); // 樹非空,先將根節點壓入棧TreeNode* cur = root; // 當前節點TreeNode* last = NULL; // 上一次訪問的節點while (!node_stack.empty()){cur = node_stack.top();if ((cur->left == NULL && cur->right == NULL) || (last != NULL && (cur->left == last || cur->right == last))){data.push_back(cur->val);node_stack.pop();last = cur;}else{if (cur->right) node_stack.push(cur->right);if (cur->left) node_stack.push(cur->left);}}return data;}
};