LeetCode-987-二叉树的垂序遍历

C++实现:

class Solution {
public:
    map > m;// record idx
    unordered_map h; //record high
    void preorder(int idx,TreeNode* root,int high){//前序遍历 记录位置 和层次
        if(!root) return;
        m[idx].push_back(root->val);
        h[root->val] = high;//保证不存在重复值,对每一个节点有一个对应的高度
        preorder(idx-1,root->left,high+1);
        preorder(idx+1,root->right,high+1);
    }
    void mysort(vector &a){//对每一列排序,高度不同则暗战高度排列,高度相同比较节点值大小
        for(int i = 0;ii;--j){
                if(h[a[j-1]]>h[a[j]]){
                    swap(a[j-1],a[j]);
                    tag= true;
                }
                else if(h[a[j-1]]==h[a[j]]&&a[j-1]>a[j]){
                    swap(a[j-1],a[j]);
                    tag= true;
                }
            }
            if(tag==false) break;//已排好则提前退出
        }
    }
    
    vector> verticalTraversal(TreeNode* root) {
        vector> ret;
        if(!root) return ret;
        
        preorder(0,root,0);   
        for(auto &it:m){
            mysort(it.second);//取保存的第二项
            ret.push_back(it.second);
        }
        return ret;
    }
};

 

你可能感兴趣的:(LeetCode专栏)