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;
        }
    };
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  • 相关阅读:
    类的内部成员之五-----内部类
    接口的使用
    java中abstract关键字的使用
    Redis主从复制原理——哨兵模式(Sentinel)
    Redis主从复制原理——薪火相传
    Redis主从复制原理——一主二仆
    Git---使用Github实现团队内协作操作步骤
    Final知识点总结
    代码块知识点总结
    Linux学习计划
  • 原文地址:https://www.cnblogs.com/lyr-2000/p/14069686.html
Copyright © 2011-2022 走看看