1. 程式人生 > 實用技巧 >陣列轉 二叉樹 ,並且輸出二叉樹的右檢視

陣列轉 二叉樹 ,並且輸出二叉樹的右檢視

題目描述
請根據二叉樹的前序遍歷,中序遍歷恢復二叉樹,並打印出二叉樹的右檢視

示例1
輸入
複製
[1,2,4,5,3],[4,2,5,1,3]
返回值
複製
[1,3,5]
備註:
二叉樹每個節點的值在區間[1,10000]內,且保證每個節點的值互不相同。

struct Node {
    int val;
    Node*left,*right;
    Node (int x):val(x),left(NULL),right(NULL) {};
    
};
class Solution {
public:
    
    /**
     * 程式碼中的類名、方法名、引數名已經指定,請勿修改,直接返回方法規定的值即可
     * 求二叉樹的右檢視
     * @param xianxu int整型vector 先序遍歷
     * @param zhongxu int整型vector 中序遍歷
     * @return int整型vector
     */
    vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
        // write code here
        //中序 確定左右子樹,先序確定根節點
        deque<Node*> dq;
        vector<int>res;
        int n = xianxu.size();
        Node* root = make_tree(xianxu,zhongxu,0,n-1,0,n-1);
        dq.push_back(root);
        while(dq.size()) {
            int n = dq.size();
            while(--n) {
                Node* root = dq.front();dq.pop_front();
                if (root -> left) dq.push_back(root->left);
                if (root -> right) dq.push_back(root-> right);
                //一層丟進去
            }
            Node* r = dq.front();dq.pop_front();
            if (r -> left) dq.push_back(r -> left);
            if (r -> right) dq.push_back(r -> right);
            res.push_back(r -> val);
            
            
            
        }
        
        return res;
        
    }
    
    Node * make_tree(vector<int>&pre,vector<int>&mid, int lx,int rx,int lz,int rz) {
        if (lx> rx) return NULL;
        Node* root = new Node(pre[lx]);
        
        int i=0;
        for(i=lz;i<=rz;++i) if(mid[i] == pre[lx]) break;
        // 中間節點 劃分左右子樹
        int rightNodeCount = rz - i;
        root -> left = make_tree(pre,mid,lx+1,rx-rightNodeCount,lz,i-1);
        
        root -> right = make_tree(pre,mid,rx-rightNodeCount+1,rx,i+1, rz);
        return root;
    }
};