二叉树中序遍历

二叉树中序遍历

 

 详细思路

cur是当前需要判断,只有当前想要才push,只有想使用值才pop,二叉树必画六星图 二叉树中序遍历

 

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> stk;
        TreeNode*cur=root;
        while(cur||!stk.empty()){
            while(cur){
                stk.push(cur);
                cur=cur->left;
            }
            TreeNode*tmp=stk.top();
            stk.pop();
            ans.push_back(tmp->val);
            cur=cur->right;
        }
    }
};
详细思路 莫里斯遍历,下降期处理好cur的左子树pre,然后上升期遍历左子树, 当上升期结束正好下一个节点是子树cur->right 这样循环,一个循环既包括下降处理pre又包括上升遍历

 二叉树中序遍历

 

 

 

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        TreeNode *pre,*cur=root;
        while (cur) {
            if (cur->left) {
                //找到pre
                //如果pre->right不存在说明是下降期,需要连接pre并去下一个节点
                //如果pre->right为cur说明是上升期,需要更新答案断开pre去下一个节点,当上升期结束正好下一个节点就是cur->next
                pre = cur->left;
                while (pre->right&&pre->right != cur)pre = pre->right;
                if (!pre->right) {
                    pre->right = cur;
                    cur = cur->left;
                }
                else if(pre->right==cur){
                    ans.push_back(cur->val);
                    pre->right = nullptr;
                    cur = cur->right;
                }
            }
            //如果没有左孩子,说明需要更新答案通过pre上升
            else if(!cur->left){
                ans.push_back(cur->val);
                cur = cur->right;
            }
        }
        return ans;
    }
};

 

上一篇:【计算几何】【凸包周长】【思维】城墙


下一篇:AcWing 368. 银河