/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型vector
*/
vector<int> vec;
//下面再介绍一种二叉树的神级遍历方法->Morris遍历
//Morris遍历可以做到时间复杂度为O(N)空间复杂度为O(1)
vector<int> preorderTraversal(TreeNode* root) {
// write code here
if(root==NULL)//为空直接返回
return vec;
TreeNode*cur=root;
while(cur){//当cur不为空时
TreeNode*mostRight=cur->left;
if(mostRight){//如果当前节点有左子树,则找到左子树上的最右节点
while(mostRight->right&&mostRight->right!=cur){
mostRight=mostRight->right;
}
if(!mostRight->right){//mostRight的右孩子是空节点,说明此时是第一次遇到cur这个节点,将其放入vec中
mostRight->right=cur;//并且将其右孩子节点指向cur节点
vec.push_back(cur->val);
cur=cur->left;
}
else{//说明此时是第二次遇到cur节点,此时将指针调整回来
mostRight->right=NULL;
cur=cur->right;
}
}
else{//说明当前节点cur没有左子树,此时直接将其放入vec中,因为不会再遇到cur了
vec.push_back(cur->val);
cur=cur->right;
}
}
return vec;
}
};
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型vector
*/
vector<int> vec;
//下面再介绍一种二叉树的神级遍历方法->Morris遍历
//Morris遍历可以做到时间复杂度为O(N)空间复杂度为O(1)
vector<int> preorderTraversal(TreeNode* root) {
// write code here
if(root==NULL)//为空直接返回
return vec;
TreeNode*cur=root;
while(cur){//当cur不为空时
TreeNode*mostRight=cur->left;
if(mostRight){//如果当前节点有左子树,则找到左子树上的最右节点
while(mostRight->right&&mostRight->right!=cur){
mostRight=mostRight->right;
}
if(!mostRight->right){//mostRight的右孩子是空节点,说明此时是第一次遇到cur这个节点,将其放入vec中
mostRight->right=cur;//并且将其右孩子节点指向cur节点
vec.push_back(cur->val);
cur=cur->left;
}
else{//说明此时是第二次遇到cur节点,此时将指针调整回来
mostRight->right=NULL;
cur=cur->right;
}
}
else{//说明当前节点cur没有左子树,此时直接将其放入vec中,因为不会再遇到cur了
vec.push_back(cur->val);
cur=cur->right;
}
}
return vec;
}
};