zoukankan      html  css  js  c++  java
  • 数组转 二叉树 ,并且输出二叉树的右视图

    题目描述
    请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图

    示例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;
        }
    };
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  • 相关阅读:
    FJNU 1151 Fat Brother And Geometry(胖哥与几何)
    FJNU 1157 Fat Brother’s ruozhi magic(胖哥的弱智术)
    FJNU 1159 Fat Brother’s new way(胖哥的新姿势)
    HDU 3549 Flow Problem(最大流)
    HDU 1005 Number Sequence(数列)
    Tickets(基础DP)
    免费馅饼(基础DP)
    Super Jumping! Jumping! Jumping!(基础DP)
    Ignatius and the Princess IV(基础DP)
    Keywords Search(AC自动机)
  • 原文地址:https://www.cnblogs.com/lyr-2000/p/14069686.html
Copyright © 2011-2022 走看看